Mi concentro sul valori di event.getAction() e tutti gli annessi e connessi...
Ecco il codice:
OnTouchListener onTouchListener=new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: X=(int)event.getX(); Y=(int)event.getY(); Log.e("event.getAction() down",""+event.getAction()); break; case MotionEvent.ACTION_MOVE: int currentX=(int)event.getX(); int currentY=(int)event.getY(); currentX=Math.max(10, Math.min(currentX,v.getWidth()-10)); currentY=Math.max(10,Math.min(currentY,v.getHeight()-10)); v.scrollBy(X-currentX, Y-currentY); X=currentX; Y=currentY; Log.e("event.getAction() move",""+event.getAction()); break; } return true; } }; imageView.setOnTouchListener(onTouchListener);Ed ecco i codici che ottengo da event.getAction() sull'evento DOWN e MOVE.
05-11 11:36:49.125: E/event.getAction() down(3496): 0 05-11 11:36:50.177: E/event.getAction() move(3496): 2 05-11 11:36:50.218: E/event.getAction() move(3496): 2 05-11 11:36:50.234: E/event.getAction() move(3496): 2 05-11 11:36:50.283: E/event.getAction() move(3496): 2 05-11 11:36:50.302: E/event.getAction() move(3496): 2Al DOWN ottengo zero, mentre al MOVE ottengo 2.
Aggiungiamo UP:
OnTouchListener onTouchListener=new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: X=(int)event.getX(); Y=(int)event.getY(); Log.e("event.getAction() down",""+event.getAction()); break; case MotionEvent.ACTION_MOVE: int currentX=(int)event.getX(); int currentY=(int)event.getY(); currentX=Math.max(10, Math.min(currentX,v.getWidth()-10)); currentY=Math.max(10,Math.min(currentY,v.getHeight()-10)); v.scrollBy(X-currentX, Y-currentY); X=currentX; Y=currentY; Log.e("event.getAction() move",""+event.getAction()); break; case MotionEvent.ACTION_UP: Log.e("event.getAction() up",""+event.getAction()); break; } return true; } }; imageView.setOnTouchListener(onTouchListener);
05-11 11:43:17.934: E/event.getAction() down(3543): 0 05-11 11:43:19.812: E/event.getAction() move(3543): 2 05-11 11:43:19.831: E/event.getAction() move(3543): 2 05-11 11:43:19.862: E/event.getAction() move(3543): 2 05-11 11:43:19.918: E/event.getAction() move(3543): 2 05-11 11:43:20.039: E/event.getAction() move(3543): 2 05-11 11:43:20.050: E/event.getAction() move(3543): 2 05-11 11:43:20.073: E/event.getAction() move(3543): 2 05-11 11:43:20.118: E/event.getAction() move(3543): 2 05-11 11:43:20.886: E/event.getAction() up(3543): 1Bene.
I codici sono 0, 2 e 1 rispettivamente per DOWN, MOVE e UP.
Aggiungo gli altri valori:
case MotionEvent.ACTION_DOWN: Log.e("event.getAction() down",""+event.getAction()); break; case MotionEvent.ACTION_POINTER_DOWN: Log.e("event.getAction() pointer down",""+event.getAction()); break; case MotionEvent.ACTION_POINTER_UP: Log.e("event.getAction() pointer up",""+event.getAction()); break; case MotionEvent.ACTION_UP: Log.e("event.getAction() up",""+event.getAction()); break;Ecco: Sequenza:
indice giù medio giù medio su indice su
05-11 17:04:23.343: E/event.getAction() down(5658): 0 "" "" 05-11 17:04:32.408: E/event.getAction() up(5658): 1I movimenti del medio non vengono proprio segnalati, passando completamente "muti".
Sequenza:
indice giù medio giù indice su medio su
05-11 17:07:18.452: E/event.getAction() down(5658): 0 "" 05-11 17:07:24.066: E/event.getAction() pointer up(5658): 6 05-11 17:07:25.797: E/event.getAction() up(5658): 1Adesso facciamo la correzione con la maschera e vediamo il confronto...
OnTouchListener onTouchListener=new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction() & event.ACTION_MASK){
case MotionEvent.ACTION_DOWN:
Log.e("event.getAction() down",""+event.getAction());
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.e("event.getAction() pointer down",""+event.getAction());
break;
case MotionEvent.ACTION_POINTER_UP:
Log.e("event.getAction() pointer up",""+event.getAction());
break;
case MotionEvent.ACTION_UP:
Log.e("event.getAction() up",""+event.getAction());
break;
}
return true;
}
};
imageView.setOnTouchListener(onTouchListener);
Sequenza:
indice giù medio giù medio su indice su
05-11 21:50:03.180: E/event.getAction() down(22986): 0 05-11 21:50:03.969: E/event.getAction() pointer down(22986): 261 05-11 21:50:05.013: E/event.getAction() pointer up(22986): 262 05-11 21:50:05.900: E/event.getAction() up(22986): 1
Sequenza:
indice giù medio giù indice su medio su
05-11 21:51:43.030: E/event.getAction() down(22986): 0 05-11 21:51:44.041: E/event.getAction() pointer down(22986): 261 05-11 21:51:45.039: E/event.getAction() pointer up(22986): 6 05-11 21:51:46.461: E/event.getAction() up(22986): 1
Un po' "confusivo"...
Cerco di tirare le fila del discorso in modo "pulito".
Scrivo un codice che mi dà event.getAction() e event.getAction() & MotionEvent.ACTION_MASK:
OnTouchListener onTouchListener=new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction() & event.ACTION_MASK){ case MotionEvent.ACTION_DOWN: Log.e("event.getAction() down",""+event.getAction()); Log.e("event.getAction() down MASK",""+(event.getAction() & event.ACTION_MASK)); break; case MotionEvent.ACTION_POINTER_DOWN: Log.e("event.getAction() pointer down",""+event.getAction()); Log.e("event.getAction() pointer down MASK",""+(event.getAction() & event.ACTION_MASK)); break; case MotionEvent.ACTION_POINTER_UP: Log.e("event.getAction() pointer up",""+event.getAction()); Log.e("event.getAction() pointer up MASK",""+(event.getAction() & event.ACTION_MASK)); break; case MotionEvent.ACTION_UP: Log.e("event.getAction() up",""+event.getAction()); Log.e("event.getAction() up MASK",""+(event.getAction() & event.ACTION_MASK)); break; } return true; } };e vediamo il risultato:
05-12 02:19:04.006: E/event.getAction() down(32362): 0 05-12 02:19:04.006: E/event.getAction() down MASK(32362): 0 05-12 02:19:05.007: E/event.getAction() pointer down(32362): 261 05-12 02:19:05.007: E/event.getAction() pointer down MASK(32362): 5 05-12 02:19:06.116: E/event.getAction() pointer up(32362): 262 05-12 02:19:06.116: E/event.getAction() pointer up MASK(32362): 6 05-12 02:19:07.175: E/event.getAction() up(32362): 1 05-12 02:19:07.175: E/event.getAction() up MASK(32362): 1Ecco: con ACTION_DOWN e ACTION_UP non ottengo nessuna differenza fra il valore senza AND ACTION_MASK, mentre con ACTION_POINTER_DOWN e ACTION_POINTER_UP ottengo una differenza:
Senza MASK ottengo rispettivamente 261 e 5;
Con MASK ottengo rispettivamente 262 e 6.
Trasponendo tutto questo in codice binario, ottengo questo:
ACTION_DOWN: 00000000 00000000 ACTION_UP: 00000001 00000001 ACTION_POINTER_DOWN: 1 00000101 0 00000101 ACTION_POINTER_UP: 1 00000110 0 00000110Quindi ACTION_MASK risulta fondamentale per coprirmi il bit basso del byte alto, in modo da farmi ottenere il codice 5 e 6 rispettivamente per ACTION_POINTER_DOWN e ACTION_POINTER_UP.
Risolto e compresa l'utilità della MASK!
Nessun commento:
Posta un commento