Android:深入理解事件分发机制实现原理

一、事件分发机制的基本概念

事件分发机制是指在Android系统中,当用户对屏幕上的控件进行触摸操作时,系统会依次把事件传递给控件树上的每个View控件,直到有一个控件成功处理了该事件或者所有控件都未成功处理该事件。

Android的事件分发机制中涉及到三个重要的类:View、ViewGroup和 MotionEvent。View是控件的基类,ViewGroup是可以持有多个子View的View,而MotionEvent则是触摸事件类。

事件分发机制的核心是ViewGroup.dispatchTouchEvent()方法和View.onTouchEvent()方法。前者是ViewGroup分发事件的方法,后者是View处理事件的方法。

二、事件分发机制的流程

事件分发机制的流程可以描述为:当用户对屏幕进行触摸操作后,系统会把该事件交给当前活动的Window对象。Window对象收到事件后会先交给DecorView进行处理。DecorView是Window对象的根View,它是一个FrameLayout,拥有多个子View,即Activity中设置的布局文件。接着DecorView会调用dispatchTouchEvent()方法把事件传递给子View,直到有一个子View成功处理了该事件。

当ViewGroup接收到事件时,会先调用自己的onInterceptTouchEvent()方法来询问是否拦截该事件,如果该方法返回true,则表明该ViewGroup会处理该事件,否则就把该事件交给该ViewGroup的子View进行处理。如果所有的子View都不能处理该事件,则该事件继续向上层的ViewGroup传递,直到确定该事件被处理或者整个控件树中不存在可以处理该事件的View。

三、事件分发机制的代码实现

    
        public class MyViewGroup extends ViewGroup {

            public MyViewGroup(Context context) {
                super(context);
            }

            public MyViewGroup(Context context, AttributeSet attrs) {
                super(context, attrs);
            }

            public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
            }

            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                // 对子View进行布局
            }

            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {
                // 进行事件分发
                boolean handled = false;
                if (onInterceptTouchEvent(ev)) {
                    handled = onTouchEvent(ev);
                } else {
                    handled = getChildAt(0).dispatchTouchEvent(ev);
                }
                return handled;
            }

            @Override
            public boolean onInterceptTouchEvent(MotionEvent ev) {
                // 进行事件拦截
                return true;
            }

            @Override
            public boolean onTouchEvent(MotionEvent event) {
                // 处理事件
                return true;
            }
        }
    

四、事件分发机制的注意事项

1、onInterceptTouchEvent()方法可以拦截事件的传递,如果该方法返回true,则表明当前ViewGroup会处理该事件;

2、onTouchEvent()方法中必须要调用super.onTouchEvent()方法,否则子View将不会收到触摸事件;

3、在Activity的布局中,可以使用android:onClick=””属性来直接绑定点击事件,也可以调用View的setOnClickListener()方法来动态绑定点击事件;

4、在处理多点触摸事件时,必须使用event.getActionMasked()来获取事件类型,只有event.getAction()可能获取不到正确的事件类型。

五、事件分发机制的优化

在事件分发机制中,每个View都要进行事件的分发和处理,如果View的层级结构非常复杂,那么就会导致事件处理过程非常耗费系统资源。

针对这个问题,可以使用一些优化方式来加速事件的分发和处理,例如:

1、对于不需要接收触摸事件的View,可以设置setClickable(false)或setFocusable(false),这样可以避免不必要的事件分发;

2、在View的onTouchEvent()方法中,可以进行事件过滤,例如判断点击事件是否处于某个范围内,避免不必要的事件处理;

3、在View的onTouchEvent()方法中,可以进行手势识别,例如判断是否有左滑或右滑的动作,从而在系统底层减少事件的发送。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/181847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-23 06:43
下一篇 2024-11-23 06:43

相关推荐

  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • Spring S_CSRF防护机制实现及应用

    Spring S_CSRF防护机制是Spring Security框架提供的一个针对跨站请求伪造攻击(CSRF)的保护机制。本文将从以下几个方面详细介绍Spring S_CSRF防…

    编程 2025-04-28
  • 抖音外放亲妈下葬事件的背后真相

    近期,一段抖音外放亲妈下葬的视频引发广泛关注和热议。不少人对这个事件感到震惊和愤怒,认为这种行为非常不尊重亲人,触犯了社会公德和家庭道德。但是,事情真相到底是什么呢?我们有必要从多…

    编程 2025-04-28
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27
  • Python的垃圾回收机制

    本文将对Python的垃圾回收机制进行详细阐述,着重介绍它的基本原理和实现方式。此外,我们还将介绍常见的问题及解决方法,并给出相应的代码示例。 一、Python的垃圾回收概述 垃圾…

    编程 2025-04-27
  • cc.director.on事件监听器

    本文将从多个方面详细介绍Cocos Creator中的cc.director.on事件监听器。 一、cc.director.on的作用和用法 cc.director.on是Coco…

    编程 2025-04-27
  • 机制与策略分离

    了解机制与策略分离的解决方法与优势 一、概述 机制与策略分离是一种软件设计理念,它将复杂的系统、组件等模块化,通过分离机制与策略,把模块实现的方式与具体使用方式分开。 机制是实现某…

    编程 2025-04-27

发表回复

登录后才能评论