Search code examples
androidtouch-event

Android - Detect End of Long Press


I am working on application in which a user needs to press and hold a button for a long time.

How can I detect the moment that the user: finishes the press or moves their touch position?

Thanks


Solution

  • I think your best bet is to use a combination of the onLongClickListener() and onTouchListener() for that button. You'll need to catch certain events on the touch listener since it will trigger for every touch event.

    Try something like the following:

    class Blah extends Activity {
         private Button mSpeak;
         private boolean isSpeakButtonLongPressed = false;
    
         @Override
         public void onCreate(Bundle icicle) {
              super.onCreate(icicle);
              setContentView(R.layout.blahlayout);
              Button mSpeak = (Button)findViewById(R.id.speakbutton);
              mSpeak.setOnLongClickListener(speakHoldListener);
              mSpeak.setOnTouchListener(speakTouchListener);
         }
    
         private View.OnLongClickListener speakHoldListener = new View.OnLongClickListener() {
    
              @Override
              public boolean onLongClick(View pView) {
                   // Do something when your hold starts here.
                   isSpeakButtonLongPressed = true;
                   return true;
              }
         }
    
         private View.OnTouchListener speakTouchListener = new View.OnTouchListener() {
    
              @Override
              public boolean onTouch(View pView, MotionEvent pEvent) {
                   pView.onTouchEvent(pEvent);
                   // We're only interested in when the button is released.
                   if (pEvent.getAction() == MotionEvent.ACTION_UP) {
                        // We're only interested in anything if our speak button is currently pressed.
                        if (isSpeakButtonLongPressed) {
                             // Do something when the button is released.
                             isSpeakButtonLongPressed = false;
                        }
                   }
                   return false;
              }
         }
    }