Mein Verständnis ist, dass Sie, wenn Sie eine Ansicht haben, die zu klein ist, um sie leicht zu berühren, ein TouchDelegate verwenden sollten, um den anklickbaren Bereich für diese Ansicht zu vergrößern.
Bei der Suche nach Verwendungsbeispielen bei Google werden jedoch mehrere Personen gestellt, die die Frage stellen, aber nur wenige Antworten.
Kennt jemand die richtige Methode, um einen Touch-Delegaten für eine Ansicht einzurichten, um beispielsweise den anklickbaren Bereich in alle Richtungen um 4 Pixel zu vergrößern?
Antworten:
Ich habe einen Freund bei Google gefragt, der mir helfen konnte, die Verwendung von TouchDelegate herauszufinden. Folgendes haben wir uns ausgedacht:
quelle
Ich konnte dies mit mehreren Ansichten (Kontrollkästchen) auf einem Bildschirm erreichen, die größtenteils aus diesem Blog-Beitrag stammen . Grundsätzlich nehmen Sie die Lösung von emmby und wenden sie einzeln auf jede Schaltfläche und deren Eltern an.
In meinem Fall hatte ich eine Rasteransicht von Bildansichten mit überlagerten Kontrollkästchen und rief die Methode wie folgt auf:
Arbeitet großartig für mich.
quelle
Diese Lösung wurde von @BrendanWeinstein in Kommentaren gepostet.
Anstatt eine zu senden
TouchDelegate
, können SiegetHitRect(Rect)
Ihre Methode überschreibenView
(falls Sie eine erweitern).quelle
emmbys Ansatz hat bei mir nicht funktioniert, aber nach ein paar Änderungen hat es funktioniert:
Vielleicht kann es jemandem Zeit sparen
quelle
Laut dem Kommentar von @Mason Lee hat dies mein Problem gelöst. Mein Projekt hatte ein relatives Layout und eine Schaltfläche. Eltern ist also -> Layout und Kind ist -> eine Schaltfläche.
Hier ist ein Google Link Beispiel Google Code
Im Falle des Löschens seiner sehr wertvollen Antwort habe ich hier seine Antwort eingefügt.
Einige Worte von mir: Wenn Sie die linke Seite erweitern möchten, geben Sie einen Wert mit Minus an, und wenn Sie die rechte Seite des Objekts erweitern möchten, geben Sie einen Wert mit Plus an. Dies funktioniert genauso mit oben und unten.
quelle
Ist es nicht die bessere Idee, dieser bestimmten Komponente (Button) Padding zu geben?
quelle
Ein bisschen spät zur Party, aber nach viel Recherche benutze ich jetzt:
Dies ist besser als die akzeptierte Lösung, da damit auch ein TouchDelegate für jede Vorgängeransicht festgelegt werden kann, nicht nur für die übergeordnete Ansicht.
Im Gegensatz zur akzeptierten Lösung wird das TouchDelegate auch aktualisiert, wenn sich das Layout der Vorgängeransicht ändert.
quelle
Wenn Sie dies nicht programmgesteuert tun möchten, erstellen Sie einfach einen transparenten Bereich um das Bild. Wenn Sie das Bild als Hintergrund für die Schaltfläche (Ansicht) verwenden.
Der graue Bereich kann transparent sein, um den Berührungsbereich zu vergrößern.
quelle
In den meisten Fällen können Sie die Ansicht, für die ein größerer Berührungsbereich erforderlich ist, in eine andere kopflose Ansicht (künstliche transparente Ansicht) einbinden, der Wrapper-Ansicht Polster / Rand hinzufügen und das Klicken / Berühren sogar an die Wrapper-Ansicht anhängen, anstatt an die ursprüngliche Ansicht muss einen größeren Berührungsbereich haben.
quelle
Verwenden Sie den folgenden Code, um den Touch-Bereich mit wenigen Einschränkungen generisch zu erweitern.
Damit können Sie den Berührungsbereich des Gegebenen
view
innerhalb der gegebenenancestor
Ansicht um die gegebenenexpansion
in Pixel erweitern. Sie können einen beliebigen Vorfahren auswählen, solange sich die angegebene Ansicht im Layoutbaum der Vorfahren befindet.Einschränkungen, die gelten:
TouchDelegate
auf a gesetzt werdenViewGroup
. Wenn Sie mit mehreren Touch-Delegaten arbeiten möchten, wählen Sie verschiedene Vorfahren aus oder verwenden Sie einen komponierenden Touch-Delegaten, wie unter Verwenden mehrerer TouchDelegate erläutert .quelle
Da mir die Idee, auf den Layoutdurchlauf zu warten, um die neue Größe des TouchDelegate-Rechtecks zu erhalten, nicht gefallen hat, habe ich mich für eine andere Lösung entschieden:
Und dann in einem Layout:
Die Idee ist, dass TouchSizeIncreaser FrameLayout den Spinner (kann eine beliebige untergeordnete Ansicht sein) umschließt und alle Berührungsereignisse, die in seinem Treffer erfasst wurden, direkt an die untergeordnete Ansicht weiterleitet. Es funktioniert für Klicks. Der Spinner öffnet sich auch dann, wenn er außerhalb seiner Grenzen geklickt wird. Er ist sich nicht sicher, welche Auswirkungen dies auf andere komplexere Fälle hat.
quelle