-Listener может быть использован для этого.

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

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

Спасибо

 Squonk31 мая 2011 г., 10:06
Вы должны объяснить больше, почему перемещение пользователя важно. Что касается определения конца длинного нажатия, просто используйте setOnLongClickListener (). Метод onLongClick () будет вызываться автоматически, когда пользователь отпускает кнопку.
 John O'Connor25 мая 2012 г., 00:43
Это неправильно - метод onLongClick запускается, как только обнаруживается длинный щелчок, т. Е. Как только наступает тайм-аут для «длинного щелчка», а НЕ, когда пользователь отпускает кнопку.

Ответы на вопрос(4)

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

Это особенно важно знать, потому что если вы реализуете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.

onFocusChanged-Listener может быть использован для этого.

OnTouchListener за это.

Решение Вопроса

что вам лучше всего использовать комбинацию 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;
          }
     }
}
 DAVIDBALAS123 июл. 2016 г., 15:41
Когда я долго нажимал кнопку, действие запускалось дважды, я исправлял его, возвращая true вместо false внутри onTouchListener.
 alfdev14 сент. 2015 г., 16:06
Спасибо Джон, отличное решение.
 X0927 авг. 2016 г., 12:54
Это совершенно то, что я хочу!
 Kristofor Carle08 сент. 2014 г., 21:36
Это сработало для меня, спасибо!
 Bugs Happen11 мар. 2019 г., 11:18
Как это отличное решение? Пользователь должен прекратить удерживать вид, чтобы получить егоpEvent.getAction() == MotionEvent.ACTION_UP быть обнаруженным, в то время как пользователь ожидает касания и удержания и запускает процесс автоматически, вместо касания и удержания и отпускания.

Ваш ответ на вопрос