Как сделать что-то повторно, пока кнопка нажата?


Я разрабатываю приложение TV-Remote Simulator В Android, используя специальное промежуточное ПО (не имеет значения).

В случае кнопок регулировки громкости (Volume+ и Volume -), то, что я пытаюсь сделать, это отправить сигнал "Volume Up" повторно, пока его кнопка нажата.

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

  1. Объявлена булева переменная

    boolean pressedUp = false;
    
  2. Объявлен внутренний класс с помощью следующей задачи AsyncTask:

    class SendVolumeUpTask extends AsyncTask<Void, Void, Void> {
    
        @Override
        protected Void doInBackground(Void... arg0) {
            while(pressedUp) {
                SendVolumeUpSignal();
        }
        return null;
    }
    

    }

  3. Добавьте слушателя к кнопке:

    final Button buttonVolumeUp = (Button) findViewById(R.id.volup);
    buttonVolumeUp.setOnTouchListener(new View.OnTouchListener() {
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
    
            case MotionEvent.ACTION_DOWN:
    
                if(pressedUp == false){
                    pressedUp = true;
                    new SendVolumeUpTask().execute();
                }
    
            case MotionEvent.ACTION_UP:
    
                pressedUp = false;
    
        }
            return true;
        }
    });
    

Я также пробовал с простыми потоками, как всчетчик инкремента-декремента при нажатии кнопки , но ни один из них не работал. Приложение прекрасно работает для остальных кнопок (каналов и т.д.), но изменение громкости полностью игнорируется.

2 8

2 ответа:

Вы забыли добавить перерыв; в конце MotionEvent.ACTION_DOWN: дело. Это означает, что строка pressedUp = false; выполняется даже при этом действии. Правильнее было бы сделать следующее:

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

    case MotionEvent.ACTION_DOWN:

        if(pressedUp == false){
            pressedUp = true;
            new SendVolumeUpTask().execute();
        }
    break;
    case MotionEvent.ACTION_UP:

        pressedUp = false;

}
    return true;
}

Рассматривали ли вы