2010-07-13 4 views
5

Ich mache ein Spiel auf Android und ich muss bestimmte Aktionen tun, wenn die Benutzer einen langen Druck auf dem Bildschirm versucht. Leider habe ich keine Methoden gefunden, die direkt mit einem benutzerdefinierten SurfaceView funktionieren. Sagen Sie mir bitte, ob es eine solche Methode gibt :)Long Touch auf einem SurfaceView (Android)

Also entschied ich mich, eine lange Berührungserkennung vom onTouch Event Listener zu implementieren.

hier ist mein Code:

@Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 


      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 


      }else if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       //stop timer 
       touchDuration = System.currentTimeMillis() - touchTime; 

       if (touchDuration < 800) 
       { 
        onShortTouch(event,touchDuration); 
       }else 
       { 
        onLongTouch(event,touchDuration); 
       } 
      } 
     } 

     return true; 

Dies funktioniert, aber ich kann erkennen, ob die Presse eine lange drücken oder war nicht nur, wenn der Benutzer aufhört, das Telefon zu berühren. Es ist nicht genau das, was ich will. Ich würde es vorziehen, wenn ein Timer starten würde, wenn der Benutzer den Bildschirm zum ersten Mal berührt, und sobald 800 ms verstrichen sind, wird die LongTouch() -Methode aufgerufen. Mit anderen Worten, ich möchte nicht überprüfen müssen, wie lange ACTION_UP seit ACTION_DOWN abgelaufen ist. Ich glaube, ich sollte einen Thread für den besagten Timer verwenden, aber ich kann es nicht funktionieren lassen.

 @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 

      TouchThread touchThread = new TouchThread(); 

      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 
       touchThread.setEvent(event); 
       touchThread.run(); 
      } 

     return true; 
    } 


    private class TouchThread extends Thread 
    { 

      public MotionEvent event = null; 

      public void setEvent(MotionEvent e) 
      { 
       event = e; 
      } 

      @Override 
      public void run() 
      { 
       long startTime = System.currentTimeMillis(); 
       long time = 0; 

       while(event.getAction() == MotionEvent.ACTION_DOWN) 
       { 
        time = System.currentTimeMillis() - startTime; 
        if(time > 800) 
        { 
         System.out.println("LOOONG CLICK!!"); 
         return; 
        } 
       } 
      } 
    } 

Hat jemand eine Idee: Wenn Sie den folgenden Code verwenden, wird die Debug-Meldung, sobald ich den Bildschirm berühren angezeigt? Eine andere Lösung wäre ebenfalls willkommen.

Danke.

Antwort

3

Eine nette Option, wenn Sie auch eine manuelle Ereignisverarbeitung tun mögen, ist die GestureDetector Klasse: http://developer.android.com/reference/android/view/GestureDetector.html

Wie verwende ich es ist eine GestureDetector Instanz im Konstruktor zu machen, implementieren die Methoden, die ich interessiert bin, und dann zu Beginn des onTouchEvent() -Methode so etwas wie:

if (gestureDetector.onTouchEvent(event)) { 
     return true; 
    } 

, die dann in den meisten Fällen bedeutet, wenn eine Geste erkannt wird, dass der Rest Ihres Touch Handhabung abbricht. Langes Drücken ist jedoch ein wenig anders, weil die lange Druckmethode keinen Wert zurückgibt. In diesem Fall habe ich einfach einen booleschen Wert, den ich bei langem Drücken festlege, dass ich später in der Touch-Event-Handling-Methode nachspüre, falls nötig.

1

Sie können den OnLongClickListener auf Ihrer SurfaceView einstellen.

mySurfaceView.setOnLongClickListener(l); 

Dann in Ihrem Surface, müssen Sie die onTouchEvent außer Kraft zu setzen:

public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return true; 
} 
3

es ganz einfach ist, eigentlich. In Ihrem Konstruktor der Ansicht, dies tun:

setOnLongClickListener(new View.OnLongClickListener() 
{ 
    public boolean onLongClick(View v) { 
     Log.v("debug", "LONG CLICK!"); 
     return true; 
    } 
    } 
); 

Dann onTouchEvent außer Kraft setzen:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
    } 

Und Sie werden eingestellt;).