Android事件分发详解(二)——Touch事件传入到Activity的流程
发布日期:2021-06-30 11:16:29 浏览次数:2 分类:技术文章

本文共 2235 字,大约阅读时间需要 7 分钟。

PS:该系列博客已更新,详情请参见:http://blog.csdn.net/lfdfhl/article/details/50707742http://blog.csdn.net/lfdfhl/article/details/50707731http://blog.csdn.net/lfdfhl/article/details/50707724http://blog.csdn.net/lfdfhl/article/details/50707721http://blog.csdn.net/lfdfhl/article/details/50707714http://blog.csdn.net/lfdfhl/article/details/50707713http://blog.csdn.net/lfdfhl/article/details/50707700
* Demo描述:
 
* Touch事件传入到Activity的流程 *  * 设备上Touch事件首先是传递到了Activity,再由Activity传递到 * 外层布局ViewGroup,再到内层ViewGroup,最后直到内层ViewGroup里的某个View. * 这就是事件的传递. *  * 在此看一下Touch事件传递到Activity,再由Activity传递到外层布局ViewGroup的过程. * 主要看的还是Touch事件由Activity传递到外层布局ViewGroup的过程 * 1 Touch事件传递到Activity的过程. *   该过程有些复杂,能力有限,看不懂;亦不是应用开发的重点,故略过. * 2 Activity传递Touch事件到外层布局ViewGroup的过程 *   首先会传递到Activity的dispatchTouchEvent()方法,源码如下: *   public boolean dispatchTouchEvent(MotionEvent ev) { *      if (ev.getAction() == MotionEvent.ACTION_DOWN) { *          onUserInteraction(); *       } *      if (getWindow().superDispatchTouchEvent(ev)) { *         return true; *      } *      return onTouchEvent(ev); *   } *    *  (1)onUserInteraction()方法是空方法,暂且不管. *  (2)调用getWindow().superDispatchTouchEvent(ev) *     即调用了PhoneWindow的superDispatchTouchEvent(ev)方法. *     @Override *     public boolean superDispatchTouchEvent(MotionEvent event) { *        return mDecor.superDispatchTouchEvent(event); *     } *     在该方法中会调用DecorView的superDispatchTouchEvent(event)方法. *     DecorView是一个定义在PhoneWindow中的一个内部类.定义如下: *     private final class DecorView extends FrameLayout implements RootViewSurfaceTaker{} *     发现没有,它是继承自FrameLayout的?其实,系统会对任意一个Activity的最外层布局嵌套一个FrameLayout. *     嗯哼,是不是暗示着什么........ *     继续看DecorView的superDispatchTouchEvent(event)方法,源码如下: *     public boolean superDispatchTouchEvent(MotionEvent event) { *        return super.dispatchTouchEvent(event); *     } *     在该方法中方法中调用了super.dispatchTouchEvent(event); *     即调用了FrameLayout(也就是ViewGroup)的dispatchTouchEvent(event); *     剩下的流程就和ViewGroup的事件分发一致了. * (3)如果getWindow().superDispatchTouchEvent(ev)方法返回的false即事件未被消费. *    此时if条件不满足,于是代码继续往下执行那么就会调用onTouchEvent(ev) *    也就是Activity的onTouchEvent(MotionEvent event). *    剩下的流程也不用多说了. *  * 参考资料: * http://feelyou.info/analyze_android_touch_event/ * Thank you very much */

转载地址:https://it9527.blog.csdn.net/article/details/42241297 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android事件分发详解(一)——View的事件分发
下一篇:Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月07日 05时29分34秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章