Как сделать так: если кнопка нажата и не отпущена, действие повторяется

Подскажите, как можно так сделать. Нужно максимально просто и понятно. Пишу игру на Android Studio.


Ответы (2 шт):

Автор решения: igo
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      Button btn = findViewById(R.id.btn);

      btn.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View view, MotionEvent motionEvent) {
              if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
                  //нажата
              }
              if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                  //отпустили
              }
              return true;
          }
      });

      ...

    }
→ Ссылка
Автор решения: Вася Воронцов

Это работало для меня

void action() {
    // Do smth
};

public void main() {
    Runnable change, check;
    Handler handler = new Handler();
    Button button;

    change = new Runnable() {
        @Override
        public void run() {
            action();
            handler.postDelayed(change, 80);
        };
    };
    check = new Runnable() {
        @Override
        public void run() {
            if (button.isPressed()) {
                handler.post(change);
            };
        };
    };
    button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    action();
                    handler.postDelayed(check, 600);
                    break;
                case MotionEvent.ACTION_UP:
                    handler.removeCallbacksAndMessages(null);
                    break;
            };
            return false;
        };
    });
};

Первый Runnable (check) проверяет, нажата ли кнопка спустя 0,6 секунды. Если это так, то запускается новый Runnable (change), который делает то, что требуется (метод action()) каждые 0,08 секунды. Отпускание пальца удаляет из выполнения все Runnable. button - любая назначенная кнопка.

→ Ссылка