¿Cómo hacer algo repetidamente mientras se presiona un botón?
Estoy desarrollando una aplicación de TV-Remote Simulator en Android usando un middleware específico (no de importancia).
En el caso de los botones de volumen (Volumen + y Volumen-), lo que estoy tratando de hacer es enviar la señal "Aumentar volumen" repetidamente mientras se presiona su botón.
- EditText en ListView pierde foco cuando se presiona en Android 4.x
- GC y onTouch causan un error de señal fatal 11 (SIGSEGV) en la aplicación que utiliza ffmpeg a través de ndk
- "Presione y mantenga presionado" en Android necesita cambiar estados (selector XML personalizado) usando onTouchListener
- Incorporación de ListView dentro de la Galería
- Android deja de enviar eventos onTouch
Eso es lo que intenté por fin (código para uno de los botones, el otro debe ser idéntico excepto los nombres):
-
Declarado una variable booleana
boolean pressedUp = false;
-
Se declara una clase interna con la siguiente AsyncTask:
class SendVolumeUpTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... arg0) { while(pressedUp) { SendVolumeUpSignal(); } return null; }
}
-
Agregue el oyente al botón:
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; } });
También he intentado con hilos simples como en el contador Increment-Decrement mientras el botón está presionado pero ninguno de los dos ha funcionado. La aplicación funciona finamente para el resto de los botones (canales, etc.), pero el cambio de volumen se ignora por completo.
- ¿Es OnTouchListener más rápido que OnClickListener?
- Android WindowManager TYPE_SYSTEM_ALERT Diseño en el tacto
- Obtener elemento de ListView sólo con OnTouchListener
- Cómo agregar la funcionalidad de deslizar en Android CardView?
- No puede manejar simultáneamente los eventos de clic y de toque
- Usando OnTouchListener y OnLongClickListener interfiere entre sí
- Diseño con posición dinámica
- Manejo del evento de toque Intercept sin extender ViewGroup
Olvidaste añadir un descanso; Al final del caso MotionEvent.ACTION_DOWN:. Eso significa que la línea pressedUp = false; Se ejecuta incluso en esa acción. Lo correcto sería:
@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; }
Ha considerado
- Inicio de la tarea repititive en el evento onKeyDown
- ¿Detener la tarea en el evento onKeyUp ?
- AlarmManager: cómo programar una alarma diaria y hacer frente a cambios de tiempo
- Las pestañas personalizadas de Chrome de Android / la API web de Fitbit no se redireccionarán si la aplicación ya está autorizada. (OAuth2.0)