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 viewinnerhalb der gegebenen ancestorAnsicht um die gegebenen expansionin Pixel erweitern. Sie können einen beliebigen Vorfahren auswählen, solange sich die angegebene Ansicht im Layoutbaum der Vorfahren befindet.
public static void expandTouchArea(final View view, final ViewGroup ancestor, final int expansion) {
ancestor.post(new Runnable() {
public void run() {
Rect bounds = getRelativeBounds(view, ancestor);
Rect expandedBounds = expand(bounds, expansion);
// LOG.debug("Expanding touch area of {} within {} from {} by {}px to {}", view, ancestor, bounds, expansion, expandedBounds);
ancestor.setTouchDelegate(new TouchDelegate(expandedBounds, view));
}
private Rect getRelativeBounds(View view, ViewGroup ancestor) {
Point relativeLocation = getRelativeLocation(view, ancestor);
return new Rect(relativeLocation.x, relativeLocation.y,
relativeLocation.x + view.getWidth(),
relativeLocation.y + view.getHeight());
}
private Point getRelativeLocation(View view, ViewGroup ancestor) {
Point absoluteAncestorLocation = getAbsoluteLocation(ancestor);
Point absoluteViewLocation = getAbsoluteLocation(view);
return new Point(absoluteViewLocation.x - absoluteAncestorLocation.x,
absoluteViewLocation.y - absoluteAncestorLocation.y);
}
private Point getAbsoluteLocation(View view) {
int[] absoluteLocation = new int[2];
view.getLocationOnScreen(absoluteLocation);
return new Point(absoluteLocation[0], absoluteLocation[1]);
}
private Rect expand(Rect rect, int by) {
Rect expandedRect = new Rect(rect);
expandedRect.left -= by;
expandedRect.top -= by;
expandedRect.right += by;
expandedRect.bottom += by;
return expandedRect;
}
});
}
Einschränkungen, die gelten:
- Der Berührungsbereich darf die Grenzen des Vorfahren der Ansicht nicht überschreiten, da der Vorfahr das Berührungsereignis abfangen muss, um es an die Ansicht weiterzuleiten.
- Es kann nur einer
TouchDelegateauf a gesetzt werden ViewGroup. 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 .