2017-07-21 8 views
-1

Dies ist der Code, den ich für meine onTouchListener gemacht:Ich muss meine app Unterstützung Pinch-Zoom, aber nicht doppelt antippen

if(event.getAction() == MotionEvent.ACTION_UP) { 
       Log.i("", "double touch : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 500) { 
        Log.i("", "double touch TRUE"); 
        timeLastTouch = System.currentTimeMillis(); 
        return true; 
       } else { 
        Log.i("", "double touch FALSE"); 
        timeLastTouch = System.currentTimeMillis(); 
        return false; 
       } 
      }else if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 500) { 
        Log.i("", "double touch TRUE DOWN"); 
        timeLastTouch = System.currentTimeMillis(); 
        return true; 
       }else { 
        Log.i("", "double touch FALSE DOWN"); 
        return false; 
       } 
      }else { 
       timeLastTouch = System.currentTimeMillis(); 
       Log.i("","double touch ELSE FALSE"); 
       return false; 
      } 

Aber es funktioniert nicht. Diese Ansicht ist über eine Oberflächenansicht. Jetzt muss ich die Ereignisse nur zum SurfaceView schicken (Pinch to Zoom) Nun habe ich versucht, die Logik zu machen, so dass, wenn es Doppel-Touch hat, dann true (es hat die Berührung verbraucht, so dann die Oberfläche Blick, bekommt nicht die Berührung). ABER wenn ich das tue, funktioniert die Prise zum Zoomen auch nicht. Wenn ich diese Logik entfernen, klicke Zoom, funktioniert, also habe ich einige Protokolle hinzugefügt und folgte ihnen. Mir ist aufgefallen, dass beim Pinch-Zoom nur 2 Down-Events kommen und erst nachdem ACTION_MOVE aufgerufen wurde. Vermutlich, weil, wenn Sie zum Zoomen drücken, Sie 2 Finger ablegen und dann zoomen. Mein Problem ist, dass mein Code es eingestellt hat, für die zweite Action_down die Berührung zu konsumieren, was bedeutet, dass die Prise zum Zoomen nicht startet. Irgendwelche Ideen wie das zu beheben?

+0

Sie können sich [vorhandene Pinch-Implementierungen] (https://android-arsenal.com/search?q=pinch) ansehen und sehen, wie sie es tun. – CommonsWare

+0

Nun, ich brauche die Pinch-Logik nicht zu implementieren. das existiert schon. auf die Aussicht, die unter meiner Sicht ist. Alles, was ich will, ist so, dass meine Ansicht die Berührung für Doppeltipp verbraucht, aber nicht für Prise. (Protokollieren der event.action) gibt 0 0 1 (action_down, action_down, action_up) für das Doppeltippen zurück und gibt 0 0 2/1 (action_down, action_down, move oder up) zum Quetschen zurück. Daher mein Problem. Ursache Wenn ich das zweite Action_down-Ereignis blockiere, bekomme ich den Pinch-Zoom nicht. Wenn ich es nicht blockiere, wird es zur nächsten Ansicht geschickt, und das MUSS nicht passieren. –

+0

Daher brauche ich eine Logik, um zu wissen, wann ein Pinch-Zoom passiert, bevor das MotionEvent für "move" aufgerufen wird. und ich habe versucht mit event.getIndexCounter() oder überprüfen, ob es Multi-Touch ist, aber es gibt nur 1 für mich zurück –

Antwort

0

tat ich es schaffe, dies zu tun, mit der folgenden Logik:

viewTop.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.i("","double touch event action: ==========================="); 
      Log.i("","double touch event action:" + event.getAction()); 
      if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       Log.i("", "double touch DOWN : " + timeLastTouch + "... time passed: " + (System.currentTimeMillis() - timeLastTouch) + "..... location diff: " + (event.getX() - xLastTouch)); 
       if (System.currentTimeMillis() - timeLastTouch < 1000 && Math.abs(event.getX() - xLastTouch) < 150 && Math.abs(event.getY() - yLastTouch) < 150) { 
        Log.i("", "double touch TRUE DOWN"); 
        timeLastTouch = System.currentTimeMillis(); 
        xLastTouch = event.getX(); 
        yLastTouch = event.getY(); 
        return true; 
       } else { 
        timeLastTouch = System.currentTimeMillis(); 
        xLastTouch = event.getX(); 
        yLastTouch = event.getY(); 
        Log.i("", "double touch FALSE DOWN"); 
        return false; 
       } 
      }else if(event.getAction() == MotionEvent.ACTION_UP) { 
       timeLastTouch = System.currentTimeMillis(); 
       xLastTouch = -1f; 
       yLastTouch = -1f; 
       return false; 
      }else { 
       timeLastTouch = System.currentTimeMillis(); 
       xLastTouch = event.getX(); 
       yLastTouch = event.getY(); 
       Log.i("","double touch ELSE FALSE"); 
       return false; 
      } 
     } 
    }); 

Aber wenn ich tippen verdoppeln, und der zweite Hahn ist in einem anderen Ort, wird es geschehen. Nicht so glücklich darüber, also muss ich mehr darüber nachdenken, also werde ich diese Antwort nicht einfach akzeptieren. Ich muss irgendwie wissen, ob ich den zweiten Action_Down konsumiere oder nicht, bevor der action_move durch die Prise aufgerufen wird.

Verwandte Themen