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.

Respuestas a la pregunta(9)

Su respuesta a la pregunta