美文网首页
Android事件分发机制的源码分析(一)-Activity篇

Android事件分发机制的源码分析(一)-Activity篇

作者: 大佬不是大佬 | 来源:发表于2019-07-26 21:44 被阅读0次

这里只做源码分析,事件的种类,定义,传递方法都不此做赘述。

可以参考上一篇:Android部分事件分发机制篇 - 简

1、找到入口:Activity之dispatchTouchEvent()。

    1,判断是否 ACTION_DOWN事件,是执行 onUserInteraction(),点进去发现,实际只是一个空方法,可以子类实现。

    2,然后判断 getWindow().superDispatchTouchEvent(ev),这方法是 WIndow对象调用的,然而 PhoneWIndow是 Window对象唯一实例,因此,可以了解为 PhoneWindow之superDispatchTouchEvent(ev)。

        如果true,则代表事件执行结束,不往下派发,消费掉了。如果 false,执行 onTouchEvent(ev)。

PhoneWindow之superDispatchTouchEvent(ev).

    mDecor是DecorView(顶层布局),本质是一个FrameLayout。所以这里实际是调用DecorView的 superDispatchTouchEvent(event) 。我们点进去看一下。

DecorView之superDispatchTouchEvent(event)

    从这里可以看到,调用了父方法,而 DecorView本质是一个 FrameLayout,是ViewGroup的子类但并没有重写。因此,我们可以看做,这里实质是调用了 ViewGroup的dispatchTouchEvent(event).,我们稍后在看 ViewGroup的方法,先理清楚 Activity事件分发书序。

    综上所述,getWindow().superDispatchTouchEvent(ev) 就是执行ViewGroup 的dispatchTouchEvent(event) 。

Activity之onTouchEvent()

    mWindow.shouldCloseOnTouch(this, event)通过注释了解到,用于处理发生在 Window的边界外,其他 View得不到事件。返回true时,调用 finish()结束 Activity。其他情况全都false,一律不做处理。

    也就是说:一个点击事件未被 Acitivity下任何一个 View接收或处理,默认是false。只有点击到了 Window边界外才返回 true,一般用于处理 Window边界外的触摸事件。

总结:

    点击事件传递入口为:Activity的dispatchTouchEvent()

    传递顺序:Activity的dispatchTouchEvent() ->Window(PhoneWindow)->DecorView-> ViewGroup。如果 ViewGroup的dispatchTouchEvent=false(也就是令getWindow().superDispatchTouchEvent(ev) = false)。

    那么,就会执行 Activity的OnTouchEvent(),true代表消费了事件,一般都是默认false。

相关文章

网友评论

      本文标题:Android事件分发机制的源码分析(一)-Activity篇

      本文链接:https://www.haomeiwen.com/subject/phjjrctx.html