前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )

作者头像
韩曙亮
发布2023-03-29 14:24:25
8540
发布2023-03-29 14:24:25
举报
文章被收录于专栏:韩曙亮的移动开发专栏

Android 事件分发 系列文章目录

【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )

【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )


文章目录

一、Activity 的事件传递


手指触摸到 Android 手机屏幕时 , 先由硬件驱动层产生事件 , 然后传递到 Framework 层 , 之后传递到 AMS , 最后到 Activity 界面中 ;

在 Activity 界面中 , 会第一时间调用 dispatchTouchEvent 方法 , 然后会按照下图的层级 , 逐步向下分发触摸事件 ;

Activity | dispatchTouchEvent 分析 :

先判定该触摸事件是否是按下操作 , MotionEvent.ACTION_DOWN ;

触摸事件有

4

种操作 :

  • 按下 : MotionEvent.ACTION_DOWN ;
  • 移动 : MotionEvent.ACTION_MOVE ;
  • 抬起 : MotionEvent.ACTION_UP ;
  • 取消 : MotionEvent.ACTION_CANCEL , 手指移出组件边界 , 产生取消事件 ;

Activity | dispatchTouchEvent 源码示例 :

代码语言:javascript
复制
public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback, WindowControllerCallback,
        AutofillManager.AutofillClient {
    /**
     * Called to process touch screen events.  You can override this to
     * intercept all touch screen events before they are dispatched to the
     * window.  Be sure to call this implementation for touch screen events
     * that should be handled normally.
     *
     * @param ev The touch screen event.
     *
     * @return boolean Return true if this event was consumed.
     */
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        	// 判定是否是第一次按下 
        	// 该方法与事件传递机制流程无关 
        	// 提供给用户按下时可以执行的业务逻辑 
            onUserInteraction();
        }
		
		// getWindow() 获取的是 PhoneWindow 窗口 
		// 调用 PhoneWindow 的 superDispatchTouchEvent ; 
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }
    
    public void onUserInteraction() {
    }
}

源码地址 : /frameworks/base/core/java/android/app/Activity.java

二、PhoneWindow 事件传递


在上述 Activity 的 dispatchTouchEvent 方法中 , 调用了 PhoneWindow 的 superDispatchTouchEvent 方法 ;

Activity 的下一层是 PhoneWindow ;

PhoneWindow | superDispatchTouchEvent 源码 :

代码语言:javascript
复制
public class PhoneWindow extends Window implements MenuBuilder.Callback {
    // This is the top-level view of the window, containing the window decor.
    private DecorView mDecor;
    @Override
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return mDecor.superDispatchTouchEvent(event);
    }
}

源码路径 : /frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java

三、DecorView 事件传递


在 PhoneWindow 的 superDispatchTouchEvent 方法中 , 调用了 DecorView 的 superDispatchTouchEvent 方法 ;

PhoneWindow 的下一层是 DecorView ;

DecorView | superDispatchTouchEvent 源码 :

代码语言:javascript
复制
public class DecorView extends FrameLayout implements RootViewSurfaceTaker, WindowCallbacks {
    public boolean superDispatchTouchEvent(MotionEvent event) {
        return super.dispatchTouchEvent(event);
    }
}

源码路径 : /frameworks/base/core/java/com/android/internal/policy/DecorView.java

四、ViewGroup 事件传递

DecorView 中的 superDispatchTouchEvent 中 , 调用父类的 superDispatchTouchEvent 方法 , 这里涉及到事件分发 superDispatchTouchEvent 方法的 DecorView 的父类是 ViewGroup ;

DecorView 是 FrameLayout 的子类 , FrameLayout 是 ViewGroup 的子类 ;

代码语言:javascript
复制
@UiThread
public abstract class ViewGroup extends View implements ViewParent, ViewManager {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android 事件分发 系列文章目录
    • 文章目录
    • 一、Activity 的事件传递
    • 二、PhoneWindow 事件传递
    • 三、DecorView 事件传递
    • 四、ViewGroup 事件传递
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档