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);
}
}
}

