Android How to change Button Background on OnTouchListener

12,867

Solution 1

Using Ontouch you wont get the Clicked state of your button

use Onclick Coz , In onclick method Pressed state of button will be true

Actually I need to get button click and release

use this to get click and release

GPIO_0_B.setOnClickListener(new OnClickListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {

            GPIO_0_B.setBackground(R.drawable.round_button_focus);

        } else if (event.getAction() == MotionEvent.ACTION_UP) {

            GPIO_0_B.setBackground(R.drawable.round_button_unfocused);
        }
    }
};

For touch listner change this line GPIO_0_B.setOnClickListener(new OnClickListener() {

to GPIO_0_B.setOnTouchListener(new OnTouchListener() {

how can I do with its id, Actually I have more than one button

Do this in onCreate():

   {
     Button GPIO_0_B1 =(Button) findViewById(R.id.youridfromxml);
     Button GPIO_0_B1 =(Button) findViewById(R.id.youridfromxml);

     GPIO_0_B1.setOnClickListener(getOnClickDoSomething(GPIO_0_B1);
     GPIO_0_B2.setOnClickListener(getOnClickDoSomething(GPIO_0_B2);
   }

Now

create new method (outside oncreate() method:- info for noobs)

View.OnClickListener getOnClickDoSomething(final Button Gpbot)
{
    return new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if(event.getAction() == MotionEvent.ACTION_DOWN) {

                Gpbot.setBackground(R.drawable.round_button_focus);

            } else if (event.getAction() == MotionEvent.ACTION_UP) {

                Gpbot.setBackground(R.drawable.round_button_unfocused);
            }
        }
    }
}

Solution 2

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            v.setPressed(true);
            //doYourWorkHere();
            break;
        case MotionEvent.ACTION_UP:
            v.setPressed(false);
            //doYourWorkHere();
            break;
        }

    return true;/* true to deactivate other listeners at the same time; false otherwise */
}

Solution 3

Just setting a layout as a background to your Button in xml will do the trick. have a xml in your drawable folder named for eg:clickedstate.xml like this

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  

<item     android:state_enabled="false"     
android:drawable="@drawable/default_bgnd" />

<item     android:state_focused="true"        
android:drawable="@drawable/new_green" />

<item     android:state_pressed="true"        
android:drawable="@drawable/new_green" />

<item     android:state_checked="true"        
android:drawable="@drawable/new_green"/>

<item     android:state_selected="true"        
android:drawable="@drawable/new_green" /> 
</selector> 

In your xml just do this for your button

android:background="@drawable/clickedstate"

Solution 4

You can use the below code through the onclick event listener to achieve this :

       StateListDrawable states = new StateListDrawable(); 

        Drawable image_normal = //drawable of the image
        Drawable image_focused =  //drawable of the image
        Drawable image_pressed =  //drawable of the image

        states.addState(new int[] {android.R.attr.state_pressed},image_focused);
        states.addState(new int[] {android.R.attr.state_focused},image_pressed);       
        states.addState(new int[] { },image_normal);  
        buttonObj.setBackgroundDrawable(states);
Share:
12,867
Haris
Author by

Haris

Updated on June 25, 2022

Comments

  • Haris
    Haris almost 2 years

    Hi I have a button in xml, and I am using OnTouchListener in my activity to get button press and release. But the problem is that when I press the button the background color is not changing. Where as when I extend may activity with OnClickListener the background is changing. Can any one tell what wrong with my code.

     public class pushbuttonActivity extends Activity implements OnTouchListener {
    @Override
            public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
                setContentView(R.layout.push_button_layout);
                GPIO_0_B  = (Button) findViewById(R.id.GPIO_0);
            GPIO_0_B.setOnTouchListener((OnTouchListener) this); 
         }
    
        public boolean onTouch(View v,MotionEvent event) {
                switch(v.getId()) {
                    case R.id.GPIO_0 :  GPIOPORT=0;
                                break;
    
                default      :  break;                  
                }
    
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                   //Do something on touch    
                     } else if (event.getAction() == MotionEvent.ACTION_UP) {
                      //Do something in release
                     } 
                return true;
            }
    

    push_button_layout.xml

    <RelativeLayout .........
    .................
          <Button
            android:id="@+id/GPIO_0"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:background="@drawable/round_button"
            android:textStyle="bold"
            android:textSize="14sp"
            android:text="GPIO 0" 
            android:layout_marginTop="15dp" 
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="50dp"
           />
    

    round_button.xml

    <?xml version="1.0" encoding="utf-8" ?> 
         <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    
             <!--  Non focused states 
          --> 
          <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/round_button_unfocused" /> 
          <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/round_button_unfocused" /> 
    
           <!--  Focused states 
          --> 
          <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/round_button_focus" /> 
          <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/round_button_focus" /> 
         <!--  Pressed 
          --> 
          <item android:state_pressed="true" android:drawable="@drawable/round_button_press" /> 
        </selector>
    

    round_button_focus.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="rectangle">
      <stroke 
            android:width="1dp"
            android:color="#FF404040" /> 
      <corners 
            android:radius="6dp" /> 
    
      <size android:height="40dp"
           android:width="40dp"/>
    
      <gradient
            android:startColor="#FF6800" 
            android:centerColor="#FF8000" 
            android:endColor="#FF9700" 
            android:angle="90" /> 
    </shape>
    

    round_button_press.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="rectangle">
      <stroke 
            android:width="2dp"
            android:color="#FF606060" /> 
      <corners 
            android:radius="40dp" /> 
      <gradient
            android:startColor="#FF0000" 
            android:centerColor="#FF0000" 
            android:endColor="#FF0000" 
            android:angle="90" /> 
    </shape>
    

    round_button_unfocus.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
        android:shape="rectangle">
      <stroke 
            android:width="2dp"
            android:color="#FF606060" /> 
      <corners 
            android:radius="40dp" /> 
      <gradient
            android:startColor="#550000" 
            android:centerColor="#550000" 
            android:endColor="#550000" 
            android:angle="90" /> 
    </shape>
    

    And sorry for the lengthy post....