Cerchiamo di capire bene che significato hanno quelle maschere.
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): 2
Al 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): 1
Bene.
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): 1
I 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): 1
Adesso 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): 1
Ecco: 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 00000110
Quindi 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!