首先必须清楚android中事件的传递机制
dispatchTouchEvent->返回true:由自己的onTouchEvent处理
->返回false:->
onInterceptTouchEvent->返回false:由子view的dispatchTouchEvent处理
->返回true:->
onTouchEvent
系统默认是子view接收触摸事件,当子view处理时父view不会处理,
还有一个重要问题,当子view能够处理onTouch的down事件,则接下来的所有move,up事件都交给子view处理。当子view不能处理down事件,则接下来所有的move事件,up事件也不会处理。
现在我们有三种方法:
1,重写activity的dispatchTouchEvent,onTouchEvent方法
方法:重写onTouchEvent或者dispatchTouchEvent,自己处理父view触摸事件
优势:只要触摸在activity.setContenView的view上就会出发onTouchEvent事件,不管触摸的是子view还是父view
劣势:一般情况下触摸弹出对话框不会触发onTouchEvent事件
2,重写父view的dispatchTouchEvent ,onInterceptTouchEvent, onTouch方法
方法1:强制dispatchTouchEvent返回false
结果:父view会处理事件子view不会处理
方法2:强制onInterceptTouchEvent返回true
结果:同1
方法3:使用方法1或者方法2,然后自己重写onTouch事件,用来处理子View的触摸事件
或者在方法1、2中直接增加处理函数,不用强制返回值
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
if(touchListener!=null)
{
touchListener.onTouch(null,ev);
}
return super.dispatchTouchEvent(ev);
}
结果:虽然能实现父view与子view同时处理触摸事件,但是比较麻烦,同时如果要获取触摸坐标则需要详细计算相对位置
3,重写子view的dispatchTouchEvent , onTouch方法
方法1:强制onTouch返回false
结果:父view和子view都能处理down事件,但是move事件和up事件父view不能处理
总结:如果涉及的view不包含对话框则使用1,如果包含对话框则使用2