原文链接地址,很详细
https://www.jianshu.com/p/ce14c7d96b0c
下面直接贴使用代码了
public class TouchDelegateComposite extends TouchDelegate {
private final List<TouchDelegate> mDelegates = new ArrayList<>();
private final View mParent;
public TouchDelegateComposite(@NonNull View parent) {
super(null, parent);
mParent = parent;
}
public void addDelegate(@NonNull TouchDelegate delegate) {
mDelegates.add(delegate);
}
public void build(){
mParent.setTouchDelegate(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean res = false;
float x = event.getX();
float y = event.getY();
for (TouchDelegate delegate : mDelegates) {
event.setLocation(x, y);
res = delegate.onTouchEvent(event) || res;
}
return res;
}
}
调用方式如下,其中view的rect扩选根据自身需求来定
protected void expandTouchView(View parent, View... views){
Rect parentRect = new Rect();
parent.getHitRect(parentRect);
TouchDelegateComposite touchDelegateComposite = new TouchDelegateComposite(parent);
for (View view : views) {
Rect rect = new Rect();
view.getHitRect(rect);
rect.left = rect.left - ((ConstraintLayout.LayoutParams)view.getLayoutParams()).leftMargin;
rect.top = parentRect.top;
rect.right = rect.right + ((ConstraintLayout.LayoutParams)view.getLayoutParams()).rightMargin;
rect.bottom = parentRect.bottom;
touchDelegateComposite.addDelegate(new TouchDelegate(rect, view));
}
touchDelegateComposite.build();
}
可能大家觉得繁琐了吧(自己回头看也觉得)那就来个最简单的
viewGroup.post(() -> {
Rect rect = new Rect();
view.getHitRect(rect);
rect.left -= 30;
rect.top -= 30;
rect.right += 30;
rect.bottom += 30;
TouchDelegate touchDelegate = new TouchDelegate(rect, view);
viewGroup.setTouchDelegate(touchDelegate);
});
view为待扩展的控件,viewGroup为包裹view的容器
实现了view四周的外扩30px的范围,当然如果你的viewGroup尺寸跟view的尺寸一样,那肯定是没有效果的