Erstellen eines unregelmäßig geformten ImageButtons mit unterschiedlichen Klickzuständen

8

Ich habe ein ImageButton mit einem Selektor für gedrückte und nicht gedrückte Zustände erstellt, und das funktioniert gut.

Aber die Schaltfläche hat eine unregelmäßige Form und ich möchte nur anklickbar sein, wo das darunter liegende rechteckige Bild nicht transparent ist.

Also habe ich einen OnTouchListener implementiert, der die Koordinaten des Berührungsereignisses mit den Pixelwerten der Bitmap vergleicht (wie in der ersten Antwort hier beschrieben: Link ). Dies funktioniert in Bezug auf die Logik, die entscheidet, ob die Taste gedrückt wurde, aber jetzt ändert sich das Bild der Taste nicht mehr zu dem gedrückten Bild.

Hier ist was ich habe:

Selektor-XML-Datei:

%Vor%

Teilweise transparentes ImageButton im Layout:

%Vor%

In der Aktivität:

%Vor%     
user134926 18.06.2012, 10:20
quelle

2 Antworten

10

Ich denke, du suchst das eigentlich:

View.dispatchTouchEvent (...)

Sie müssen diese Methode in Ihrer benutzerdefinierten Schaltfläche überschreiben, um false zurückzugeben, wenn sich der Punkt nicht im gewünschten Bereich befindet. Ich schlage vor, dass Sie so vorgehen:

%Vor%

Warum nicht den OnTouchListener verwenden : Da Sie View.onTouchEvent () aufrufen müssen (was in super.dispatchTouchEvent (event) geschieht), damit View Zeichenbare Zustände verarbeiten kann (in onTouchEvent erledigt) () mit der View.refreshDrawableState () -Methode, und es gibt auch etwas mehr komplexe Logik dort)

Warum überschreiben Sie onTouchEvent () nicht : In View.dispatchTouchEvent () gibt es eine Bedingung, dass, wenn ein OnTouchListener vorhanden ist, der Listener alles verarbeiten und true zurückgeben soll. Wenn Sie später aus irgendeinem Grund einen OnTouchListener auf die Schaltfläche setzen, wird Ihre koordinatenbasierte Bedingung in onTouchEvent () nicht überprüft, da onTouchEvent () niemals aufgerufen wird. Durch das Überschreiben von dispatchTouchEvent () filtert man Berührungen ganz oben und lässt die gesamte andere Logik an Ort und Stelle - Sie können beliebige Listener zu der Schaltfläche hinzufügen und sie funktionieren wie bei normalen Schaltflächen, aber nur, wenn Ihre Bedingung wahr ist.

    
Ivan Bartsov 21.06.2012 12:19
quelle
1

Ich denke, dass Sie Ihre Kollisionserkennung ändern müssen, um zu sehen, ob die Berührung in Ihrer Taste ist oder nicht. Verwenden Sie den folgenden Ansatz.

%Vor%     
Aqif Hamid 22.06.2012 16:56
quelle