2010-12-03 8 views
1

Nun, ich habe eine benutzerdefinierte Android-Benutzeroberfläche erstellt, und ich brauche meine UI-Ansicht, um dieses Steuerelement zu behandeln.Wie wird die Keypress-Prüfung und die Wartung von UI-Aktionen durchgeführt?

a) Während meine Maustaste gedrückt wird (onDown/Taste gedrückt), sollte die Ansicht (zum Beispiel tun, eine Sache halten: Taste ist unten)

b) Sobald ich meine Maustaste loslassen sollte die Ansicht sagen (Beispiel: Key is up).

Der Probenfluss sollte etwas wie wenn ich die Ansicht drücken.

Ausgang: (Ich drücke Maustaste auf die Ansicht und halten Sie ihn)

Key ist unten

Key ist unten

Key ist unten

Key runter

Der Schlüssel ist

Key ist unten

(befreie ich jetzt Maustaste)

Key nach oben.

Um mein Problem zu erklären. Ich bin eine Code-Snippet zu veröffentlichen, wenn die logischen

@Override 

public boolean onTouchEvent(MotionEvent event) { 
    Log.d(TAG, event.getAction()); 
} 

gehen sollte Wenn ich meine Maustaste drücken, druckt es „0“ (was bedeutet, Maus nach unten), während, wenn ich es verlassen, druckt es auf dem Protokoll " 1 ", was bedeutet, dass die Maus oben ist. Das sollte mit der Logik helfen.

Danke für Ihre Hilfe.


Nun, ich habe versucht, so etwas wie

private static int checkValue = 0; 

@Override 

public boolean onTouchEvent(MotionEvent event) { 

    checkValue = event.getAction(); 

    while (checkValue == 0){ 

    Log.d(TAG, "Pressed"); 
    checkValue = checkMethod(event.getAction); 


} 

    private int checkMethod(int test){ 

    if (checkValue == 0){ 

     checkValue = 0; 
     } 

    else checkValue = 1; 
} 
+0

Was hast du probiert? Was nicht funktioniert. Außerdem haben Sie keine Maus auf Android. Wenn Sie über den Emulator sprechen, ist das eine Berührung. – Falmarri

+0

yah ich spreche über die Berührung. :) –

+0

Ich habe hinzugefügt, wie ich versucht habe zu lösen, aber ich kenne seine Buggy-Logik. –

Antwort

1

einfach eine OnTouchEventListener definieren ...

private OnTouchListener onTouchListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (v.getId() == R.id.button) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //start loop or background task 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       //do something different 
      } 
     } 
     return true; 
    } 
} 

... und weisen Sie auf Ihre Taste.

button.setOnTouchListener(onTouchListener); 

Wenn der Benutzer die Schaltfläche berührt, wird das Ereignis ACTION_DOWN ausgelöst. Wenn der Benutzer die Schaltfläche loslässt, wird das Ereignis ACTION_UP ausgelöst. Wenn Sie möchten, können Sie eine Schleife in einem Thread starten, die mit einer booleschen Variablen verglichen werden kann. Ich habe nicht überprüfen, ob es richtig ist, aber es sollte wie folgt aussehen:

private OnTouchListener onTouchListener = new OnTouchListener() { 

     private boolean flag = false; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (v.getId() == R.id.button) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        flag = true; 
        Thread thread = new Thread(new Runnable() { 

         @Override 
         public void run() { 
          while(flag) { 
           //do something 
          } 
         } 
        }); 
        thread.start(); 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        flag = false; 
       } 
      } 
      return true; 
     } 
    } 
+0

Nun das Code-Snippet Sie geschrieben funktioniert :), aber immer noch, wenn ich meine Taste loslassen (Action_up), dauert es noch ein paar Sekunden zu stoppen ... Ich fragte mich, ob die Code könnte verbessert werden, um schneller zu reagieren? :) btw danke fürs helfen ... –

1

Vielleicht könnten Sie erstellen und einen Thread starten, wenn die Berührung kommt, dass ein volatile boolean stop = false Feld hat und dass in jeder Schleife für diesen Wert überprüft, nachdem für einen Schlaf während. Wenn die Berührung beendet ist, können Sie die boolesche Variable auf false setzen.

Edit: hinzugefügt, um ein Beispiel

private MyHandler h; 

public void handleDown() { 
    System.out.println("touch began"); 
    h = new MyHandler(); 
    h.start(); 
} 

public void handleUp() { 
    h.pleaseStop = true; 
    System.out.println("touch ended"); 
} 

class MyHandler extends Thread { 
    volatile boolean pleaseStop = false; 

    public void run() { 
    while (!pleaseStop) { 
     System.out.println("touch is active..."); 
     Thread.sleep(500); 
    } 
    } 
} 
+0

Kannst du bitte ein grobes Code-Snippet posten, um mich zum Laufen zu bringen? Danke ... Und ja, ich muss sofort aufhören, wenn der Schlüssel losgelassen wird. –

+0

@Shahab: hinzugefügt ein Beispiel – thejh

+0

Danke für die Hilfe :) –

1
checkValue = event.getAction(); 
while (checkValue == 0){ 

Sie sollten nie magische Zahlen verwendet werden. Verwenden Sie die Konstanten, wie durch die API definiert:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

In der Tat ist der Code nicht einmal für Bewegungsereignisse Buchhaltung; es scheint anzunehmen, dass wenn es kein Down-Event ist, es ein Up ist ... was völlig falsch ist.

Blick in die Dokumentation, um zu sehen, welche Maßnahmen Werte können Sie erwarten, und das Richtige tun für die spezifischen Maßnahmen, die Sie interessieren zum Beispiel folgenden:.

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

+0

Danke für nette Beratung: D –

0

einen Thread erstellen, die ausgelöst wird durch die Berührung und boolean Flag, um es am Leben zu halten. Wenn die Berührung freigegeben wird, setzen Sie das Flag auf false, damit der Thread sich anschließt (beendet).

Da der Thread unabhängig von der Hauptlogik ist, ist der Prozess schneller.