Android, Gesten über anklickbare Widgets

8

Meine Anwendung enthält einen Bereich mit Schaltflächen. Ich möchte die Aktivität so implementieren, dass die Schleudergeste über den Tastenbereich zu einem von zwei anderen Bereichen wechseln würde (mit ViewFlipper).

Ich habe zwei Ansätze zum Erkennen von Gesten gemacht. Die erste beinhaltete die Verwendung von GestureDetector. Die Touch-Motion-Ereignisse über den Button haben jedoch die onTouchEvent-Aktivitätsmethode nicht ausgelöst. Daher konnte ich sie nicht an die GestureDetector-Klasse weiterleiten. Ein Fehler, kurz.

Der zweite Ansatz - die Verwendung der GestureOverlayView. Diesmal habe ich jedoch das zweite Extrem erreicht: Nicht nur die Geste wurde erkannt, auch der Knopf, über den die Geste ausgeführt wird, meldete einen Klick.

Ich wünsche mir, dass die Benutzeroberfläche folgendermaßen funktioniert: Wenn der Benutzer die Schaltfläche berührt und die Berührung freigibt (oder den Finger nur ein wenig bewegt), meldet die Schaltfläche einen Klick und es wird keine Geste erkannt. Auf der anderen Seite, wenn der Benutzer den Bildschirm berührt und eine längere Bewegung macht, sollte die Geste erkannt werden und kein Klickereignis durch die Schaltfläche gemeldet werden.

Ich habe eine kleine Proof-of-Concept-Anwendung implementiert. Der Aktivitäts-XML-Code folgt:

%Vor%

Der Aktivitäts-Java-Code folgt:

%Vor%

Die Frage ist: Wie kann man eine solche Schnittstelle implementieren, die entscheiden kann, ob die Benutzeraktion als Geste oder Tastenklick behandelt werden soll?

Mit freundlichen Grüßen - Spook.

    
Spook 21.04.2011, 16:31
quelle

2 Antworten

3

Ich habe mich selbst gelöst. Die Idee besteht darin, Gestenereignisse von GestureOverlayView abzufangen und neben der Übertragung an GestureDetector die Entfernung der Gesten des Benutzers zu messen. Die Entfernung soll im Feld einer privaten Aktivität gespeichert werden (somit für alle Event-Handler verfügbar). Schließlich überprüfen Schleuder- und Klick-Handler den Wert dieses Feldes; Wenn es unter einem bestimmten Wert liegt (z. B. 10 Pixel sind in Ordnung), sollte es als ein Klick interpretiert werden. Ansonsten - als Geste.

Beachten Sie, dass die Schaltfläche sowohl angeklickt als auch ihr Click-Handler aufgerufen wird. Ich habe beschlossen, einen Click-Handler auf niedriger Ebene zu erstellen (der über GestureOverlayView an alle Schaltflächen angefügt ist), der die Gesten / Klick-Prüfung durchführt und, wenn das Ergebnis ein Klick ist, einen der Click-Handler auf höherer Ebene auswählt.

Die Lösung funktioniert für mich; Wenn man jedoch das Klick-Aussehen der Schaltfläche deaktivieren und verhindern möchte, dass der Handler aufgerufen wird, würde dies wahrscheinlich eine Neudefinition der Schaltflächen- und / oder GestureOverlayView-Komponenten bedeuten.

    
Spook 09.05.2011, 11:54
quelle
2

eine andere Lösung: Mach diese Funktion:

%Vor%

Und rufe es für jedes Widget wie folgt auf:

%Vor%

Wenn Sie dies aus vielen Aktivitäten oder Fragmenten machen müssen, können Sie eine class.java-Datei erstellen und diese Klasse für jede Aktivität, die Sie implementieren müssen, implementieren. Dies erkennt, dass beide auf einen beliebigen Klick wischen.  Hoffe Hilfe!

    
Rambo VI 21.07.2012 18:21
quelle