(十 )View的事件分发机制

来源:互联网 发布:好的漫画软件 编辑:程序博客网 时间:2024/05/16 15:46
点击事件的事件分发,其实就是对MotionEvent事件的分发,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是分发过程。








ViewGroup包含三个方法:dispatchTouchEvevt()、onInterceptTouchEvent()(默认返回false)、onTouchEvent()
View包含两个方法:dispatchTouchEvevt()、onTouchEvent()(默认返回true,除非是不可点击的,除非clickable和longclickable同时为false)
当一个View需要处理事件时,若它设置了OnTouchListener,则该OnTouchListener中的onTouch方法会被调用,若onTouch返回false,则onTouchEvent方法被调用,若返回true,则onTouchEvent不被调用。

dispatchTouchEvevt():
返回true,事件停止分发,交由当前View的dispatchTouchEvent方法处理,意味着终止。
返回false,事件交由上层的OnTouchEvent进行处理。上层为Activity则交由Activity的OnTouchEvent,为View,则交由View的OnTouchEvent处理。
返回默认super.dispatchTouchEvent,则交由OnInterceptTouchEvent方法处理。

onInterceptTouchEvent():
返回true,事件交由当前View的OnTouchEvent方法处理
返回false,事件放行,交由子view的dispatchTouchEvent方法处理。
返回默认的super.onInterceptTouchEvevt方法,若有子View,事件交由子View的dispatchTouchEvent方法处理,若无子View,事件交由当前view的OnTouchEvent方法处理。

对于public boolean onInterceptTouchEvent(MotionEvent ev) 函数:
1当触摸点落在该控件中时不管该函数返回什么都会调用OnTouchEvent函数
2当触摸点落在该控件中的子控件上时
1>返回true会拦截该事件交给OnTouchEvent函数处理
2>返回false或者super.onInterceptTouchEvent(ev) 不会拦截事件交给OnTouchEvent函数处理而是交给子控件dispatchTouchEvent函数处理

onTouchEvent():
返回true,事件被消费。
返回false,事件一级一级上传,都有上层的view的onTouchEvent方法接受,若上层该方法也返回false,则一直上传,直至消失。并且接收不到下次事件。
返回默认super.onTouchEvent,与返回false相同。


Activity传给Window,Window的惟一实现类是PhoneWindow,PhoneWindow传给DectorView(继承自Framlayout,是父View),父传子View,注意的是onTouchListener,若设置,则屏蔽onTouchEvent事件。

下图为他人博客所做的流程图:


原创粉丝点击