Android事件分发机制

来源:互联网 发布:马云淘宝的成功 编辑:程序博客网 时间:2024/06/10 23:38

一、三个重要的方法

dispatchTouchEvent() 、
onInterceptTouchEvent()(activity和view无此方法)
activity 作为事件的原始分发着会造成无响应
view最为事件的最末端要么处理事件,要么回传事件
onTouchEvent()

二、事件分发流程
Activity–>PhoneWindow–>DecorView–>ViewGroup–>…….–>View
PhoneWindow:view的管理容器
DecorView:PhoneWindow的内部类
如果最后view不处理事件 会一次回传,如果activity不处理事件才会被浪费
这里写图片描述

当触摸事件ACTION_DOWN发生之后,先调用Activity中的dispatchTouchEvent函数进行处理,紧接着ACTION_DOWN事件传递给ViewGroup中的dispatchTouchEvent函数,接着viewGroup中的dispatchTouchEvent中的ACTION_DOWN事件传递到调用ViewGroup中的onInterceptTouchEvent函数,此函数负责拦截ACTION_DOWN事件。由于viewGroup下还包含子View,所以默认返回值为false,即不拦截此ACTION_DOWN事件。如果返回false,则ACTION_DOWN事件继续传递给其子view。由于子view不是viewGroup的控件,所以ACTION_DOWN事件接着传递到onTouchEvent进行处理事件。此时消息的传递基本上结束。从上可以分析,motionEvent事件的传递是采用隧道方式传递。隧道方式,即从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。

接下来继续分析,事件的处理。刚才ACTION_DOWN事件传递到view的onTouchEvent函数中处理了,默认是返回true,接着view的dispatchTouchEvent返回true,再接着viewGroup的dispatchTouchEvent返回true,最后Activity的dispatchTouchEvent返回true。我们发现,motionEvent事件的处理采用冒泡方式。冒泡方式,从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。

原创粉丝点击