Aby ogólnie rozszerzyć obszar dotykowy z kilkoma ograniczeniami, użyj następującego kodu.
Pozwala rozszerzyć obszar dotykowy danego vieww danym ancestorwidoku o podaną expansionw pikselach. Możesz wybrać dowolnego przodka, o ile dany widok znajduje się w drzewie układów przodków.
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);
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;
}
});
}
Obowiązujące ograniczenia:
- Obszar dotykowy nie może przekraczać granic przodka widoku, ponieważ przodek musi być w stanie złapać zdarzenie dotyku, aby przekazać je dalej do widoku.
- Tylko jeden
TouchDelegatemoże być ustawiony na ViewGroup. Jeśli chcesz pracować z wieloma delegatami dotykowymi, wybierz różnych przodków lub użyj delegata dotykowego komponującego, jak wyjaśniono w Jak korzystać z funkcji Multiple TouchDelegate .