OnTouchListener () будет выполняться только один раз, пока кнопка нажата и удерживается

1
brown = (Button) findViewById(R.id.brownButton);
    brown.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                count++;
                Log.d("count", "" + count);
                return true;
            } else if (event.getAction() == (MotionEvent.ACTION_UP)) {
                count--;
                Log.d("count", "" + count);
                return true;

            }
            return false;

        }
    });

Когда мой палец нажимает и удерживает кнопку, мой счет будет увеличиваться только один раз. Когда я отпущу, это соответственно уменьшится. Пожалуйста, может кто-нибудь покажет мне, как я могу увеличить свой код, пока мой палец удерживает кнопку нажатой. Благодарю.

  • 0
    MotionEvent.ACTION_DOWN ли вы какие-либо другие сообщения, кроме MotionEvent.ACTION_DOWN или MotionEvent.ACTION_UP , например, MotionEvent.ACTION_MOVE ?
  • 2
    Вы не получите ACTION_MOVE или другие сенсорные события, если не будете двигать пальцем. Похоже, вы хотите увеличить число на основе количества времени, прошедшего с момента нажатия кнопки.
Показать ещё 1 комментарий
Теги:

3 ответа

1

Мне также нужно было это сделать, но на этот вопрос никогда не отвечали должным образом, хотя он довольно старый. Однако здесь можно найти хорошее решение: повторное действие андроида при нажатии и удержании кнопки

Я приспосабливаю это решение к этой проблеме. Я тестировал его, и он работает для меня.

Button brown = (Button) findViewById(R.id.brownButton);
brown.setOnTouchListener(new View.OnTouchListener() {

    private Handler mHandler;
    private int count = 0;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (mHandler != null)
                return true;
            mHandler = new Handler();
            mHandler.postDelayed(mAction, 500);
            break;
        case MotionEvent.ACTION_UP:
            if (mHandler == null)
                return true;
            mHandler.removeCallbacks(mAction);
            mHandler = null;
            break;
        }
        return true; // before I had written false
    }

    Runnable mAction = new Runnable() {
        @Override
        public void run() {
            Log.d("count: ", "" + count);
            count++;
            mHandler.postDelayed(this, 500);
        }
    };

});

В будущем я применим это решение к пользовательской мягкой клавиатуре, чтобы позволить пробелу и клавишам удаления продолжать работу при удержании.

Обновление: сегодня я, наконец, добрался до клавиши непрерывного удаления. Я думал, что раньше тестировал свой код, но сегодня, когда я это делал, мне пришлось возвращать true из метода onTouch, чтобы заставить его работать.

1

Слушатель прослушивания работает следующим образом:

Он получает событие ACTION_DOWN (пользователь прикасается)

Затем он получает все следующие события (если возвращается истина) и рассматривает все следующие события как события ACTION_MOVE

Сенсорный lisetener продолжает получать события ACTION_MOVE, пока не получит событие ACTION_UP или ACTION_CANCEL.

Таким образом ACTION_DOWN запускается только один раз, затем любое количество событий ACTION_MOVE, затем либо один ACTION_UP, либо ACTION_CANCEL.

Если вы хотите, чтобы ваш счетчик увеличивался, вам нужно проверить события ACTION_MOVE.

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
     //do something on DOWN 
         break;
    case MotionEvent.ACTION_MOVE:
         //do something on MOVE
         break;
    case MotionEvent.ACTION_UP:
     //do something on UP           
         break;
    }
    return true;
}
  • 0
    Я сделал, как вы предложили, сразу после того, как я получил action_down, я проверяю action_move, но он по-прежнему выполняет мое приращение только один раз. Если я что-то неправильно понял, пожалуйста, объясните. Благодарю.
  • 0
    это необычно, это должно работать, вы можете опубликовать свой новый код?
Показать ещё 8 комментариев
1
  • 0
    Я действительно сталкивался с этим во время поиска в Google, я попробовал то же самое, что было там, и у меня был тот же конечный результат. Будет работать только один раз!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню