【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )(二)

简介: 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )(二)

二、ViewGroup | dispatchTransformedTouchEvent 完整流程分析


如果事件被拦截 , 或者没有被消费掉 , 则不会对 mFirstTouchTarget 进行初始化 , mFirstTouchTarget 为空 ;


ViewGroup | dispatchTransformedTouchEvent 方法中 ,


传入的子组件为空 , 表示事件被拦截了 , 或消费不成功 , 此时需要消费自己的触摸事件 , 调用父类 View 的 dispatchTouchEvent 方法就是消费自己的触摸事件 ;

传入的子组件不为空 , 则将事件传递给子组件 ;

 

/**
     * Transforms a motion event into the coordinate space of a particular child view,
     * filters out irrelevant pointer ids, and overrides its action if necessary.
     * If child is null, assumes the MotionEvent will be sent to this ViewGroup instead.
     * 该方法是正式分发触摸事件的方法 
     * 注意参数中传入了当前正在被遍历的 child 子组件 
     * 如果事件被拦截 , 或者没有被消费掉 , 则不会对 mFirstTouchTarget 进行初始化 , mFirstTouchTarget 为空
     */
    private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,
            View child, int desiredPointerIdBits) {
        final boolean handled;
        // Canceling motions is a special case.  We don't need to perform any transformations
        // or filtering.  The important part is the action, not the contents.
        // 处理取消状态 , 暂时不分析 ; 
        final int oldAction = event.getAction();
        if (cancel || oldAction == MotionEvent.ACTION_CANCEL) {
            event.setAction(MotionEvent.ACTION_CANCEL);
            if (child == null) {
              // 传入的子组件为空 
              // 表示事件被拦截了 / 或消费不成功
              // 消费自己的触摸事件 , 调用父类 View 的 dispatchTouchEvent 方法就是消费自己的触摸事件
                handled = super.dispatchTouchEvent(event);
            } else {
              // 组件不为空 , 则将事件传递给子组件 
                handled = child.dispatchTouchEvent(event);
            }
            event.setAction(oldAction);
            return handled;
        }
  }





三、View | dispatchTouchEvent 完整流程分析


View | dispatchTouchEvent 方法中 , 会调用 View 的 OnTouchListener 方法 , OnTouchListener 是在 View 的 ListenerInfo mListenerInfo 成员中的 OnTouchListener mOnTouchListener 成员 ;


这是用户设置的 触摸监听器 , 是开发时设置的组件的触摸事件 , 返回 true / false ;


如果返回 true 则成功消费事件 , 事件分发到此结束 ;


如果返回 false , 则事件继续向下传递 ;



public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    public boolean dispatchTouchEvent(MotionEvent event) {
            if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
                result = true;
            }
            //noinspection SimplifiableIfStatement
            // 设置的 触摸监听器 就是封装在该对象中 
            ListenerInfo li = mListenerInfo;
            // 判断该组件是否被用户设置了 触摸监听器 OnTouchListener
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    // 执行被用户设置的 触摸监听器 OnTouchListener
                    && li.mOnTouchListener.onTouch(this, event)) {
                // 如果用户设置的 触摸监听器 OnTouchListener 触摸方法返回 true
                // 此时该分发方法的返回值就是 true 
                result = true;
            }
  }
}


源码路径 : /frameworks/base/core/java/android/view/View.java





目录
相关文章
|
12月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1122 4
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
506 0
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
198 8
|
Android开发
Android PackageManagerService源码分析和APK安装原理详解
Android PackageManagerService源码分析和APK安装原理详解
924 1
|
Android开发
39. 【Android教程】触摸事件分发
39. 【Android教程】触摸事件分发
110 2
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
606 0
|
Android开发 容器
[Android]View的事件分发机制(源码解析)
[Android]View的事件分发机制(源码解析)
167 0
|
XML Java Android开发
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
292 0
|
Android开发 开发者
Android View 事件分发机制,看这一篇就够了(二)
Android View 事件分发机制,看这一篇就够了
|
Android开发
Android View 事件分发机制,看这一篇就够了(一)
Android View 事件分发机制,看这一篇就够了

热门文章

最新文章