Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 1

Я думаю, что лучше всего использовать комбинацию 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;
          }
     }
}

Ответ 2

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

Это особенно важно знать, потому что если вы реализуете маршрут onTouch при возврате false из onLongClick (AS по умолчанию дает вам и часто то, что вы хотите), ваш код 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 распространять событие конечного касания на OnClickListener.

Ответ 3

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

Ответ 4

Я думаю, что onFocusChanged -Listener можно использовать для этого.