Как сделать что-то повторно, пока кнопка нажата?
Я разрабатываю приложение TV-Remote Simulator В Android, используя специальное промежуточное ПО (не имеет значения).
В случае кнопок регулировки громкости (Volume+ и Volume -), то, что я пытаюсь сделать, это отправить сигнал "Volume Up" повторно, пока его кнопка нажата.
Вот что я наконец попробовал (код для одной из кнопок, другая должна быть идентична, за исключением названий):
-
Объявлена булева переменная
boolean pressedUp = false;
-
Объявлен внутренний класс с помощью следующей задачи AsyncTask:
class SendVolumeUpTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... arg0) { while(pressedUp) { SendVolumeUpSignal(); } return null; }
}
-
Добавьте слушателя к кнопке:
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 ответа:
Вы забыли добавить перерыв; в конце 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; }
Рассматривали ли вы
- начав свой repititive задач по метода OnKeyDown событие
- Остановка задачи на onKeyUp событие ?