detectar evento de movimiento por puntero de índice en android

Estoy trabajando en un programa multitáctil que necesita registrar solo los movimientos realizados por el segundo dedo o el puntero índice. Ahora la documentación dice que podemos usar MotionEvent.ACTION_POINTER_INDEX_MASK y & it with action y shift by INDEX_SHIFT para obtener el puntero que hizo que la acción subiera o bajara. Pero esta técnica no funciona en movimiento.

¿Hay alguna forma de que podamos detectar la acción de movimiento realizada por un determinado puntero solo?

Gracias,

preguntado el 04 de julio de 12 a las 02:07

2 Respuestas

sí, puedes tener algo así en tu View clase:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_MOVE:
            if(event.getPointerCount()>1){
                //where 1 is the index of the second finger
                final int Y = event.getY(1); 
                final int X = event.getX(1); 
            }
            break;
    }
}

por lo tanto, dependiendo del dedo que desee obtener el movimiento, puede configurar el acceso a ese índice. Recuerde que los valores pueden ser desde 0 (el primer puntero que está hacia abajo) hasta getPointerCount()-1. Probé esto en 2.2 Gingerbread, así que espero que te sea útil :)

Respondido 04 Jul 12, 08:07

Estoy usando una solución similar, pero todavía necesito usar la identificación para encontrar el índice. El usuario podría haber levantado el primer dedo y volver a bajarlo e intentar moverse, lo que según Android sería un movimiento con un puntero con el índice 1. Sin embargo, creo que la identificación sería diferente. - rajankz

si el usuario levanta un dedo, puede cambiar dinámicamente la identificación del dedo que registrará en su MotionEvent.ACTION_UP - Raykud

Puede obtener el índice de puntero efectivo comprobando qué puntero cambió:

private final int MAX_POINTER = 5; // 5 different touch pointers supported on most devices
private float mLastTouchPositionX[];
private float mLastTouchPositionY[];

@Override
public boolean onTouchEvent(MotionEvent aEvent)
int tActionIndex = aEvent.getActionIndex();
int tPointerCount = aEvent.getPointerCount();
    /*
     * Check which pointer changed on move
     */
    if (tMaskedAction == MotionEvent.ACTION_MOVE) {
        for (int i = 0; i < tPointerCount && i < MAX_POINTER; i++) {
            if (mLastTouchPositionX[i] != aEvent.getX(i) || mLastTouchPositionY[i] != aEvent.getY(i)) {
                mLastTouchPositionX[i] = aEvent.getX(i);
                mLastTouchPositionY[i] = aEvent.getY(i);
                // Found new action index
                tActionIndex = i;
                break;
            }
        }
    }
...
}

Respondido el 30 de enero de 16 a las 14:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.