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

简介: PS:该系列博客已更新,详情请参见:http://blog.csdn.net/lfdfhl/article/details/50707742http://blog.
PS:
该系列博客已更新,详情请参见:

http://blog.csdn.net/lfdfhl/article/details/50707742

http://blog.csdn.net/lfdfhl/article/details/50707731

http://blog.csdn.net/lfdfhl/article/details/50707724

http://blog.csdn.net/lfdfhl/article/details/50707721

http://blog.csdn.net/lfdfhl/article/details/50707714

http://blog.csdn.net/lfdfhl/article/details/50707713

http://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
 */

相关文章
|
1天前
|
XML Java Android开发
利用Bundle实现Android Activity间消息的传递
利用Bundle实现Android Activity间消息的传递
11 2
|
1天前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
11 3
|
1天前
|
Java Android开发
Android 切换壁纸代码流程追踪
Android 切换壁纸代码流程追踪
15 0
|
1天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
19 0
|
1天前
|
Java Android开发
Android startActivity流程
Android startActivity流程
6 0
|
1天前
|
Shell Android开发
Android Activity重写dump方法实现通过adb调试代码
Android Activity重写dump方法实现通过adb调试代码
15 0
|
1天前
|
缓存 Java Android开发
Android 9.0 WiFi 扫描结果上报和获取流程
Android 9.0 WiFi 扫描结果上报和获取流程
9 0
|
1天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
1天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
1天前
|
存储 缓存 Java
安卓应用开发中的内存优化策略
【5月更文挑战第14天】在移动应用的开发过程中,尤其是对于资源受限的安卓平台,内存管理与优化是提升性能和用户体验的关键。本文将探讨针对安卓应用开发的内存优化技巧,包括避免内存泄漏、合理使用数据结构和算法、以及利用安卓系统的垃圾回收机制。通过这些方法,开发人员可以有效减少应用对系统资源的占用,从而延长电池寿命并提高应用的稳定性。
http://www.vxiaotou.com