Detectar prensa táctil vs prensa larga vs movimiento?
Actualmente estoy jugando con la programación de Android, pero tengo un pequeño problema al detectar diferentes eventos táctiles, a saber, una presión táctil normal (presionar en la pantalla y soltar de inmediato), una presión larga (tocar la pantalla y mantener el dedo sobre ella ) y movimiento (arrastrar en la pantalla).
Lo que quería hacer es tener una imagen (de un círculo) en mi pantalla que pueda arrastrar. Luego, cuando lo presiono una vez (pulsación corta / normal) aparece una información básica sobre Toast. Cuando lo presiono durante mucho tiempo, aparece un AlertDialog con una lista para seleccionar una imagen diferente (círculo, rectángulo o triángulo).
Hice una vista personalizada con mi propio OnTouchListener para detectar los eventos y dibujar la imagen en onDraw. OnTouchListener.onTouch se parece a esto:
// has a touch press started?
private boolean touchStarted = false;
// co-ordinates of image
private int x, y;
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
touchStarted = true;
}
else if (action == MotionEvent.ACTION_MOVE) {
// movement: cancel the touch press
touchStarted = false;
x = event.getX();
y = event.getY();
invalidate(); // request draw
}
else if (action == MotionEvent.ACTION_UP) {
if (touchStarted) {
// touch press complete, show toast
Toast.makeText(v.getContext(), "Coords: " + x + ", " + y, 1000).show();
}
}
return true;
}
El problema es que la prensa no funciona como se esperaba, porque cuando toco casualmente la pantalla también detecta un pequeño movimiento y cancela la prensa táctil y se mueve alrededor de la imagen.
"Hackeé" un poco esto introduciendo una nueva variable "mTouchDelay" que configuré en 0 en ACTION_DOWN, aumento en MOVE y si es> = 3 en MOVE ejecuto mi código de "mover". Pero tengo la sensación de que este no es realmente el camino a seguir.
Tampoco he descubierto cómo detectar una pulsación larga. El culpable es realmente el MOVE que parece desencadenarse siempre.
Para ver un ejemplo de lo que más o menos quiero, vea la aplicación de Android "DailyStrip": muestra una imagen de una tira cómica. Puede arrastrarlo si es demasiado grande para la pantalla. Puede tocarlo una vez para que aparezcan algunos controles y mantenerlo presionado para ver un menú de opciones.
PD. Estoy tratando de que funcione en Android 1.5, ya que mi teléfono solo funciona en 1.5.