So verwenden Sie mehrere TouchDelegate

8

Ich habe zwei ImageButtons, jedes in einem RelativeLayout und diese zwei RelativeLayouts sind in einem anderen RelativeLayout, ich möchte TouchDelegate für jedes ImageButton einstellen. Wenn ich normalerweise TouchDelegate jedem ImageButton und seinem übergeordneten RelativeLayout hinzufüge, dann funktioniert nur ein ImageButton richtig, ein anderer erweitert nicht seinen Klickbereich. Also bitte helfen Sie mir, wie Sie TouchDelegate in beiden ImageButtons verwenden können. Wenn das nicht möglich ist, was kann dann effektiv den Klickbereich einer Ansicht erweitern? Vielen Dank im Voraus ........

Hier ist mein XML-Code:

%Vor%

Meine Aktivitätsklasse:

%Vor%

}

    
Junaid 23.07.2011, 07:51
quelle

6 Antworten

15

Sie können ein zusammengesetztes Muster verwenden, um der Ansicht mehr als ein TouchDelegate hinzuzufügen. Schritte:

  1. Erstellen Sie TouchDelegateComposite (egal welche Ansicht Sie als Argument, es wird nur verwendet, um den Kontext zu erhalten)
  2. Erstelle nötige TouchDelegates und füge sie zu composite
  3. hinzu
  4. Fügen Sie Composite zur Ansicht hinzu, da sie hier empfehlen (via view.post ( neue Runnable))

    %Vor%
need1milliondollars 18.11.2013 15:20
quelle
3

Es sollte nur ein Touch-Delegat für jede Ansicht geben. Die Dokumentation für getTouchDelegate () in der View-Klasse lautet:

"Ruft das TouchDelegate für diese Ansicht ab."

Es gibt nur ein TouchDelegate. Um nur ein TouchDelegate pro Ansicht zu verwenden, können Sie jede berührbare Ansicht innerhalb einer Ansicht mit Dimensionen umschließen, die angeben, was Sie erreichen möchten. Ein Android-Entwickler auf dem Quadrat gibt ein Beispiel, wie Sie dies für mehrere Ansichten mit nur einer statischen Methode tun können (http://www.youtube.com/watch?v=jF6Ad4GYjRU&t=37m4s):

%Vor%

}

Nehmen wir an, Sie möchten Ihre Ansichtshierarchie nicht überladen. Es gibt zwei andere Möglichkeiten, die ich mir vorstellen kann. Sie können die Grenzen des Berührbaren innerhalb der berührbaren Ansicht definieren und sicherstellen, dass alle Touchevents von den jeweiligen übergeordneten Ansichten an diese untergeordnete Ansicht übergeben werden. Oder Sie können getHitRect () für die berührbare Ansicht überschreiben. Ersteres wird Ihren Code schnell durcheinander bringen und es schwer verständlich machen, also ist letzterer der bessere Weg. Sie möchten mit overriding getHitRect gehen.

Wenn mPadding die Menge an zusätzlicher Fläche ist, die Sie in Ihrer Ansicht erreichen möchten, können Sie Folgendes verwenden:

%Vor%

Wenn Sie Code wie oben verwenden, müssen Sie überlegen, welche Touch-Ansichten in der Nähe sind. Der berührbare Bereich der Ansicht, der auf dem Stapel am höchsten ist, könnte sich über einer anderen Ansicht überlappen.

Eine andere ähnliche Option wäre, nur das Padding der berührbaren Ansicht zu ändern. Ich mag das nicht als Lösung, weil es schwierig werden kann, den Überblick über die Größe von Ansichten zu behalten.

    
Brendan Weinstein 24.02.2012 04:29
quelle
0

das schien für mich zu funktionieren Ссылка

    
Viet Nguyen 21.07.2013 02:31
quelle
0

Damit Ihr Code funktioniert, müssen Sie den linken Rand von bounds2 verkleinern und nicht erhöhen.

%Vor%

Nachdem ich mit TouchDelegate herumgespielt habe, kam ich zu dem unten stehenden Code, der für mich die ganze Zeit auf jeder Android-Version funktioniert. Der Trick besteht darin, den Bereich zu erweitern, der nach dem Aufruf des Layouts garantiert ist.

%Vor%     
sergej shafarenka 04.11.2014 11:31
quelle
0

Ok ich denke, niemand bietet die richtige Antwort, um die Lösung zu machen und es einfach zu machen. In letzter Zeit hatte ich das gleiche Problem und alle oben gelesen hatte ich nur keine Ahnung, wie nur es funktioniert. Aber schließlich habe ich es getan.Erste Sache Wenn Sie so tun, als ob Sie ein ganzes Layout haben, das Ihre zwei kleinen Knöpfe enthält, muss dieser Bereich erweitert werden, also MÜSSEN Sie ein anderes Layout innerhalb Ihres Hauptlayouts erstellen und in diesem Fall mit einem anderen Button auf Ihr neu erstelltes Layout setzen statische Methode können Sie Touch Delegate auf 2 Tasten gleichzeitig geben. Jetzt tiefer und Schritt für Schritt in Code! Zuerst findest du einfach die Ansicht deines MAINLAYOUT und Buttons (dieses Layout enthält unseren ersten Button)

%Vor%

Ok, wir haben das Hauptlayout und die Button-Ansicht gefunden, die alles enthält, nur unser onCreate() -Anzeige-Layout, aber Sie müssen es finden, um es später zu verwenden.Ok was als nächstes? Wir erstellen ein anderes RelativeLayout in unserem Hauptlayout welche Breite und Höhe ist auf Ihrem Geschmack (dieses neu erstellte Layout wird unseren zweiten Knopf halten)

%Vor%

Ok, wir haben Ansichten gefunden, so dass wir jetzt einfach den Code unseres Typen kopieren und einfügen können, der zuerst auf Ihre Frage geantwortet hat. Kopieren Sie diesen Code einfach in Ihre Hauptaktivität.

%Vor%

Nun, wie man diese Methode benutzt und sie zum Laufen bringt, hier ist wie! Fügen Sie in Ihrer onCreate() -Methode das nächste Code-Snippet ein

%Vor%

Erläuterung zu dem, was wir in diesem Abschnitt gemacht haben. Wir haben unsere erstellte statische Methode namens expandTouchArea() verwendet und drei Argumente angegeben. 1. Argument - Das Layout, das den Button enthält, welcher Bereich erweitert werden muss 2. Argument - Aktueller Button um den Bereich zu erweitern 3. Argument - der Bereich in Pixel, um den der Schaltflächenbereich erweitert werden soll! GENIEßEN SIE!

    
Vladimir Arevshatyan 20.03.2015 11:50
quelle
0

Ich hatte das gleiche Problem: Es wurde versucht, mehrere TouchDelegates für verschiedene LinearLayouts hinzuzufügen, die Touch-Ereignisse anweisen, um Switches jeweils in einem Layout zu trennen.

Für Details lesen Sie bitte diese Frage von mir und meine Antwort .

Was ich gefunden habe, ist: Sobald ich die LinearLayouts jeweils durch ein anderes LinearLayout beigefügt habe, beginnt die zweite (endet jede andere aufeinanderfolgende) TouchDelegate wie erwartet zu funktionieren.

Dies könnte dem OP helfen, eine funktionierende Lösung für sein Problem zu erstellen. Ich habe keine befriedigende Erklärung, warum es sich so verhält.

    
Speedy 04.09.2017 15:04
quelle

Tags und Links