程序员Android技术知识Android开发

Android 事件分发机制

2018-04-04  本文已影响0人  daipeneas

        Android 的事件分发机制,是Android中面试常常被问道的,也是Android开发工程师必须了解的基础知识。

        现在来简单的谈谈Android中的事件分发机制(分析源码),由于水平有限,如有不对,欢迎指正。

    ----------------------------------------------------------------------------------------------------

        按照事件分发机制顺序来将可以分为三个部分:Activity点击事件的分发机制,ViewGroup点击事件的分发机制,View点击事件的处理。

        首先Android事件分发的对象是Touch事件(用户点击事件);此事件分发由三个方法协助完成,分别是 dispatchTouchEvent()、onIntercepTouchEvent()和onTouchEvent() 。三个方法分别作用可以在下面源码中看出:

1.Activity点击事件的分发

        当一个点击事件触发的时候,首先会调用Activity的dispatchTouchEvent(),盗窃部分源码,如下图:

            首先会判断是否是ACTION_DOWN,然后调用 onUserInteraction();从源码中了解到,其实此方法内存是空方法。主要是用来实现屏保功能,详情可以看英文注释。

       接着就是getWindow().superDispatchTouchEvent(ev) ,getWindow是获取Window的类对象。由下图可以看出Window的superDispatchTouchEvent(ev)方法其实是一个抽象的方法。那么Window的实现类,是PhoneWindow 。

        接着PhoneWinow的superDispatchTouchEvent(ev) 可以看出此时是将事件交给DecorView ,我们可以认为DecorView为顶层的View,此时我们认为事件传递到了ViewGroup.

        若返回的false呢,那么就调用onTouchEvent(ev);接着看看onTouchEvent (ev) ,从源码中我们可以看出此时是处理边界外的事件。

接下来就是ViewGroup

2.ViewGroup点击事件的分发

         当事件分发到ViewGroup时候,此时也会调用ViewGroup的dispatchTouchEvent方法,截取部分源码:

        其中会判断MotionEvent.ACTION_DOWN和mFirstTouchTarget两个值。mFristTouchTarget是指若ViewGroup不拦截交由下级处理mFristTouchTarget则不为空。为空表示ViewGroup,对当前事件进行拦截。从上面我们可以到源码得注释这个FLAG_DISALLOW_INTERCEPT值也影响着ViewGroup是否拦截,因此onInterceptTouchEvent(ev)并不一定会被调用,由此也可以解决事件冲突。若ViewGruop不拦截时,紧接着看源码:

            其实上面就是对子元素进行遍历,调用下级的dispatchTochEvent ......一直反复下去,直到事件被处理。

        3.View点击事件的处理

            当事件由传递到底层的View时,此时调用底层View的dispatchTouchEvent,源码如下:

        View作为底层元素,那就只能处理事件,或者向上抛出。由上可见,首先会判断有没有设置onTouchListener,若设置了,那么其中的onTouch的方法就会被调用,再者,onTouch中的返回值为true,那么就并不触发onTouchEvent,反者就走下面的onTouchEvent,事件交由onTouchEvent处理,接下来看源码:

        由上可以看出,首先会优先判断View的clickable和long_clickable,若其中有一个为true,进入逻辑。若我们设置了onClickListener,那么在ACTION_UP中会触发performClick :

action_up里面

        下面是performClick的源码,我们可以看到,我的设置的onClick会在这里。

            那么返回false呢,表示View处理不了该事件,就会向上抛出,交给上级处理......一级一级向上抛出,最后交给activity处理。

            到此Android的事件分发机制就基本讲述完了。

            参考资料:《Android开发艺术探索》

上一篇下一篇

猜你喜欢

热点阅读