Questo argomento l'ho trattato già, ma mi risulta ostico e credo di averlo dimenticato in gran parte.
Se io aggiungo al codice per il movimento delle immagini un comando che mi metta a video il codice del comando:
@Override
public boolean onTouchEvent(MotionEvent event){
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
lastX=event.getX();
lastY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
posX+=event.getX()-lastX;
posY+=event.getY()-lastY;
invalidate();
lastX=event.getX();
lastY=event.getY();
break;
}
System.out.println(event.getAction());
return true;
}
All'evento Down ottengo il numero 0, al move il 2 e all'up (qui non contemplato) ottengo 1.Ed ecco la novità: quando abbasso il secondo dito ottengo 261, mentre quando lo sollevo ottengo 262.
In binario:
ACTION_DOWN: 0000 0000 0000 0000 ACTION_UP: 0000 0000 0000 0001 ACTION_MOVE: 0000 0000 0000 0010 Secondo puntatore giù: 0000 0001 0000 0101 Secondo puntatore su: 0000 0001 0000 0110Che cosa si ottiene col mascheramento?
La sintassi sarebbe event.getAction() & MotionEvent.ACTION_MASK.
Se MotionEvent.ACTION_MASK è 0xFF, ossia 255, questo mascheramento dovrebbe dare:
ACTION_DOWN: 0 & 0xFF ->0; ACTION_UP: 1 & 0xFF ->1; ACTION_MOVE: 2 & 0xFF->2;fin qui non cambia niente.
Proviamo ora
Secondo puntatore giù: 0000 0001 0000 0101 & 0xFF= 0000 0000 0000 0101 = 5 Secondo puntatore su: 0000 0001 0000 0110 & 0xFF= 0000 0000 0000 0110 = 6
Praticamente il mascheramento elimina il byte superiore.
Verifichiamo con il codice:
public boolean onTouchEvent(MotionEvent event){ int action=event.getAction() & MotionEvent.ACTION_MASK; switch(action){ case MotionEvent.ACTION_DOWN: lastX=event.getX(); lastY=event.getY(); break; case MotionEvent.ACTION_MOVE: posX+=event.getX()-lastX; posY+=event.getY()-lastY; invalidate(); lastX=event.getX(); lastY=event.getY(); break; } System.out.println(action); return true; }Sì: adesso il codice del secondo puntatore giù e su diventa rispettivamente 5 e 6. Come da mia previsione.
Quindi, finché si resta con un solo puntatore non ha senso mascherare MotionEvent.getAction(), mentre la cosa diventa necessaria con due puntatori, perché il codice del secondo puntatore si estende, essendo superiore a 255, anche su un byte alto, che va eliminato mediante il mascheramento AND con 0xFF.
Nessun commento:
Posta un commento