"Press and hold" button on Android needs to change states (custom XML selector) using onTouchListener
Use the view.setPressed()
function to simulate the pressed behavior by yourself.
You would probably want to enable the Pressed state when you get ACTION_DOWN
event and disable it when you get the ACTION_UP
event.
Also, it will be a good idea to disable it in case the user slide out of the button. Catching the ACTION_OUTSIDE
event, as shown in the example below:
@Overridepublic boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: v.setPressed(true); // Start action ... break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_OUTSIDE: case MotionEvent.ACTION_CANCEL: v.setPressed(false); // Stop action ... break; case MotionEvent.ACTION_POINTER_DOWN: break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_MOVE: break; } return true;}
Make sure to return false
at the end of the onTouchListener() function. :)
You can just set the button onClickListener and leave its onClick method empty.Your logic implement inside onTouch.That way you'll have the press effect.
P.S You don't need all those state in the selector you can simply use:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@drawable/IMAGE_PRESSED" /> <item android:drawable="@drawable/IMAGE" /></selector>