Android事件分发详解(一)——Touch事件传入到Activity的流程

简介: /** * Demo描述: * Touch事件传入到Activity的流程 * * 我们先大概了解Android的界面架构: * 1 每个Activity都包含一个Window对象,该对象通常由PhoneWindow实现 * 2 PhoneWindow将一个DecorView设置为整个Window的根View.
/**
 * Demo描述:
 * Touch事件传入到Activity的流程
 * 
 * 我们先大概了解Android的界面架构:
 * 1 每个Activity都包含一个Window对象,该对象通常由PhoneWindow实现
 * 2 PhoneWindow将一个DecorView设置为整个Window的根View.可以说DecorView将要显示的
 *   具体内容呈现在了PhoneWindow上
 * 3 DecorView中有一个垂直的线性布局LinearLayout.
 *   该LinearLayout包含了两个FrameLayout:
 *   第一个为:TitleView
 *   第二个为:ContentView(这就是我们最常见到和最熟悉的部分)
 * 
 * 设备上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的
 *     继续看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
 */

相关文章
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
94 6
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
31 3
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
20 0
|
7月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
78 2
|
6月前
|
Android开发 UED
Android Activity的生命周期详解
Android Activity的生命周期详解
|
7月前
|
Android开发
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
133 0
|
Android开发
Android 中Activity和Fragment生命周期的具体变化详解
Android 中Activity和Fragment生命周期的具体变化详解
210 0
|
Android开发
Android中下拉通知栏,Activity会走哪些生命周期?
我们就可以做一个总结:当前Activity中,下拉通知栏,是不走任何生命周期的。
252 0