JavascriptProva

mercoledì 11 maggio 2016

Utilità della MASK per gli eventi del multitouch.

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!

Nessun commento:

Posta un commento