Android使用TouchDelegate增加View的触摸范围
ListView Tips & Tricks #5: Enlarged Touchable Areas
TouchDelegateGroup
import android.graphics.Rect; import android.view.MotionEvent; import android.view.TouchDelegate; import android.view.View; import androidx.annotation.NonNull; import java.util.ArrayList; public class TouchDelegateGroup extends TouchDelegate { private ArrayList<TouchDelegate> mTouchDelegates = new ArrayList<>(); private TouchDelegate mCurrentTouchDelegate; public TouchDelegateGroup(@NonNull Rect bounds, @NonNull View delegateView) { super(bounds, delegateView); mTouchDelegates.add(this); } public void addTouchDelegate(@NonNull TouchDelegate touchDelegate) { mTouchDelegates.add(touchDelegate); } @Override public boolean onTouchEvent(MotionEvent event) { TouchDelegate delegate = null; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: for (TouchDelegate touchDelegate : mTouchDelegates) { if (onDelegateTouchEvent(touchDelegate, event)) { mCurrentTouchDelegate = touchDelegate; return true; } } break; case MotionEvent.ACTION_MOVE: delegate = mCurrentTouchDelegate; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: delegate = mCurrentTouchDelegate; mCurrentTouchDelegate = null; break; } if (delegate != null) { return onDelegateTouchEvent(delegate, event); } return false; } public boolean onSelfTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public boolean onDelegateTouchEvent(TouchDelegate touchDelegate, MotionEvent event) { if (touchDelegate instanceof TouchDelegateGroup) { return ((TouchDelegateGroup) touchDelegate).onSelfTouchEvent(event); } else { return touchDelegate.onTouchEvent(event); } } }