1. 定义?
2. MotionEvent的具体动作?
3. 事件分发的本质?
将点击事件传递到具体的view处理的整个过程
事件传递的过程=分发过程
4. 事件在哪对象之间进行传递?
5. 具体分发事项?
public boolean dispatchTouchEvent(MotionEvent ev)
用来进行事件的分发。如果当前事件能够传递给当前view,那么此方法一定会被调用,返回结果受当前View的onTochEvent和下级view的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
public boolean onInterceptTouchEvent(MotionEvent ev)
在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,
那么在同一个事件序列当中,此方法不会再次调用,返回结果表示是否拦截当前事件。
public boolean onTouchEvent(MotionEvent ev)
在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前view无法再次接受到事件。
对于一个根viewgroup来说,点击事件产生后,首先会传递给它,这时它的dispatchTouchEvent就会被调用,如果这个viewgroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个viewgroup处理,即它的onTouchEvent方法就会被调用;如果这个viewgroup的onInterceptTouchEvent返回false就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,如此反复直到事件被最终处理。
但我们需要考虑一种情况,如果一个view的onTouchEvent返回false,那么它的父容器的onTouchEvent将会被调用。eg.上级分给了一个程序员去处理(这是事件分发的过程),结果这个程序员搞不定,就会交给上一级进行处理。上级处理不了,会交给上上级,这样一层一层往上抛。
默认:往下分发
True:拦截处理
False:往上抛(执行上级的onTouchEvent)
注:只有viewgroup才有拦截方法
Viewgroup(相对布局,线性布局,帧布局)
Activity return false时执行onTouchEvent
return true时不执行onTouchEvent
如果view需要处理事件时,如果它设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被调用。这时事件如何要看onTouch的返回值,如果返回false则调用当前view的onTouchEvent方法会被 调用,如果返回true则不会调用onTouchEvent。View的OnTouchListener其优先级比onTouchEvent要高。在onTouchEvent中设置OnClickListener,那么它的onClick方法会被调用。OnTouchListener的优先级最低,即处于事件传递的尾端。
Activity存储在DecorView中,DecorView继承于FrameLayout,最终为viewgroup
顶级view叫根view,一般来说都是viewgroup