Wie erhalte ich die zugrunde liegende Ansicht von einem MotionEvent?

9

Meine GestureListener-Klasse empfängt ein MotionEvent in Methoden wie onSingleTap () oder onFling (). Gibt es eine Möglichkeit, die zugrunde liegende Sicht von diesem Ereignis zu bestimmen?

Hintergrund: Ich habe ein LinearLayout, das viele Kindansichten enthält. Dieses LinearLayout verfügt über einen Touch-Listener, der zu einem Gesten-Detektor aufruft. Wenn der Benutzer eine Geste in einer untergeordneten Ansicht ausführt, empfängt der Gestendetektor des LinearLayout ein MotionEvent. Aber das Problem ist, weil es viele Kinder gibt, muss ich genau wissen, welches Kind der Benutzer angetippt hat. Aber ich kann keine Methode finden, die eine Koordinate in eine Ansicht konvertiert. Gibt es eine Möglichkeit, dies zu tun?

Eine hässliche Lösung: Die Kinder werden dynamisch hinzugefügt. So kann ich alle Kinder in einer Liste behalten, dann, wenn ein MotionEvent kommt, kann ich durch die Liste iterieren und sehen, ob der Punkt in einem Kind ist. Aber ich mag diese Idee nicht. Gibt es einen besseren Weg?

    
wwyt 23.05.2011, 03:28
quelle

4 Antworten

3

Sind Sie sicher, dass Sie den Touch-Listener auf dem Layout haben möchten? Warum nicht jede Ansicht einen Touch-Listener haben?

Nehmen wir an, Sie haben eine Reihe von Switches, die Umschaltungen erfordern. Die Schalter steuern ein Monster. Du könntest jeden Schalter (deine Sicht) mit einem Touch-Listener versehen, der den Schalter an das Monster weitergibt. Jetzt kann das Monster jede Ansicht anders handhaben.

In etwa so:

%Vor%

Sie könnten das MotionEvent sogar an das Monster weitergeben. (Oder, wenn Sie eine einzelne Art von TouchListeners wollten, könnten Sie sowohl die Ansicht als auch das Ereignis an das Monster weitergeben, aber Sie verlieren Informationen darüber, welcher Schalter welcher ist.)

    
idbrii 11.08.2011 22:45
quelle
1

Da Sie einen ontouchlistener in Ihrer Hauptansichtsgruppe, dem LinearLayout, verwenden, um Bewegungsereignisse zu verarbeiten, wird der gerade Wert von ontouchlistener nicht auf andere Ziele verteilt, wenn der Rückgabewert von ontouchlistener erfüllt ist. Wahrscheinlich müssen Sie die hässliche Methode verwenden. Ich bin derzeit in diesem Thema beschäftigt und finde es wirklich nervig.

Andernfalls setzen Sie den octouchlistener für jede Kindansicht nach Bedarf.

    
Neo 23.05.2011 04:19
quelle
1

Wenn Sie können, verwenden Sie eine ListView oder GridView über Ihr Basislayout (linear oder anders) und unter Ihren Kindansichten.

Dann ...

intpos = getGridView (). pointToPosition ((int) me.getX (), (int) me.getY ());

Anzeigen v = getGridView (). getChildAt (pos);

Sie können auch den Kindern zuhören, die den booleschen Wert, den Sie zurückgeben, sorgfältig verwalten.

    
kandinski 25.08.2015 20:11
quelle
0

Geben Sie Kindern eine ID und verwenden Sie in der übergeordneten Ansicht parentView.findViewById (R.id.childviewid);

    
sat 23.05.2011 03:40
quelle

Tags und Links