根据我的经验,不建议重写dispatchTouchEvent()
方法,因为它比较难控制。我建议使用onInterceptTouchEvent()
方法。但是,Android不支持重写该选项。您可以通过创建自己的View来劫持它,下面是一个继承自RelativeLayout的代码片段:
public class InterceptTouchRelativeLayout extends RelativeLayout{
public interface OnInterceptTouchListener{
boolean onInterceptTouch(MotionEvent ev);
}
private OnInterceptTouchListener onInterceptTouchListener;
public InterceptTouchRelativeLayout(Context context) {
super(context);
}
public InterceptTouchRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptTouchRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return onInterceptTouchListener.onInterceptTouch(ev);
}
public void setOnInterceptTouchListener(OnInterceptTouchListener onInterceptTouchListener) {
this.onInterceptTouchListener = onInterceptTouchListener;
}
并像往常一样使用它,
myView.setOnInterceptTouchListener(new InterceptTouchRelativeLayout.OnInterceptTouchListener() {
@Override
public boolean onInterceptTouch(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
return false;
case MotionEvent.ACTION_MOVE:
return false;
case MotionEvent.ACTION_UP:
return true;
}
return false;
}
});
无论如何,我的建议是更多地研究视图/视图组控件的触摸事件流。以下是
onInterceptTouchEvent()
的工作原理解释,供您参考:
当我们在父视图的子视图位置触摸时,如果在ACTION_DOWN时返回false,将被认为父视图尚未夺取此触摸事件,并检查其子视图是否已实现
onTouch()
。因此,只要子视图不调用
requestDisallowInterceptTouchEvent(true)
,父视图仍然可以在
onInterceptTouchEvent()
中处理此触摸事件,而子视图可以在其自己的
onTouch()
事件中处理同一触摸事件。但是,有时您需要考虑处理父视图的
onTouch()
事件,以防没有子视图处理触摸事件,这样父视图就可以处理它。