JavascriptProva

domenica 18 settembre 2016

Mascheramento di MotionEvent.getAction() in funzione del secondo puntatore del touchscreen.

Iniziamo ora a trattare dei puntatori sul touchscreen.
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 0110
Che 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