Android-обнаружение конца длительного нажатия

Я работаю на приложение, в котором пользователь должен нажать и удерживать кнопку в течение длительного времени.

Как я могу определить момент, когда пользователь: заканчивает нажатие или перемещает свое положение касания?

спасибо

4 ответов


Я думаю, что лучше всего использовать комбинацию onLongClickListener () и onTouchListener () для этой кнопки. Вам нужно будет поймать определенные события на сенсорном прослушивателе, так как он будет срабатывать для каждого события касания.

попробуйте что-то вроде следующего:

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;
          }
     }
}

эти ответы довольно сложно. onClick С OnClickListener по-прежнему вызывается в конце долгого нажатия, если вы возвращаетесь false. Это самое простое место, чтобы обнаружить конец долгого нажатия.

это особенно важно знать потому, что если вы реализуете onTouch маршрут при возвращении false С onLongClick (по умолчанию так и часто то, что вы хотите), свой onClick код может быть вызван в конце ваших длинных нажатий без вашего понимания он.

вот пример, основанный на съемке фото или видео:

private boolean takingVideo = false;

captureButton.setOnClickListener(v -> {
    // onClick gets called after normal click or long click
    if(takingVideo) {
        saveVideo();
    } else {
        takePhoto();
    }
});

captureButton.setOnLongClickListener(v -> {
    takeVideo();

    return false;
});

private void takePhoto() {
    // Save the photo
}

private void takeVideo() {
    takingVideo = true;
    // Start capturing video
}

private void saveVideo() {
    takingVideo = false;
    // Save the video
}

как вы можете видеть, логика становится очень прямой, когда вы позволяете Android распространять событие end touch на OnClickListener.


Я думаю, вы можете использовать OnTouchListener для этого.


Я думаю onFocusChanged - для этого можно использовать прослушиватель.