Android Touch事件分发过程详解

让我来详细讲解一下“Android Touch事件分发过程详解”的完整攻略。

一、Touch事件分发的概念及过程

在Android开发中,Touch事件是非常重要的一种事件类型。而Touch事件的分发过程也是我们需要了解的重要知识之一。Touch事件分发的过程可以简单地分为三个步骤:从根View开始往下递归地遍历View树,找到最合适的View来处理事件。

1. 步骤一:Touch事件的传递

当Touch事件发生时,它会被传递到当前界面的最外层View,即DecorView,然后再由DecorView传递到Activity的ContentView,再由ContentView传递到子View,一直往下传递,直到最后的目标View。

2. 步骤二:事件的分发

事件分发的过程是从外到内依次触发了三个方法:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。

2.1 dispatchTouchEvent方法

ViewGroup会重写dispatchTouchEvent方法,同时它也是Touch事件的入口方法,它用来协调Touch事件的分发。在dispatchTouchEvent方法中,ViewGroup会调用onInterceptTouchEvent方法来判断是否拦截Touch事件。

2.2 onInterceptTouchEvent方法

在触发onInterceptTouchEvent方法时,会传入MotionEvent参数,即Touch事件。当ViewGroup的onInterceptTouchEvent方法返回true时,表示Touch事件被它拦截了,就不会再往下传递并进入View的onTouchEvent方法。如果返回false,则会继续往下传递。

2.3 onTouchEvent方法

当Touch事件被确定分发到某个View上时,该View会触发onTouchEvent方法来消费Touch事件。该方法的返回值为boolean类型,如果返回true,则表示该View消费了Touch事件,不再往下传递。如果返回false,则表示该View不消费Touch事件,会将Touch事件传递给它的父View,直到被某个View消费为止。

3. 步骤三:事件的处理

当Touch事件被一个View消费时,它就会被处理。View会根据Touch事件的类型,调用相应的方法来处理该事件,比如对于OnClickListener事件,可以通过调用View.performClick()方法来处理。

二、示例说明

为了更好地理解Touch事件分发的过程,下面来模拟两个场景,分别为ViewGroup和View的事件分发场景:

1. ViewGroup的事件分发

在一个LinearLayout中放置了4个Button。为了模拟事件分发过程,我们对LinearLayout和Button都重写了dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent方法。代码如下:

public class MyLinearLayout extends LinearLayout {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i("MyLinearLayout", "dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.i("MyLinearLayout", "onInterceptTouchEvent");
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i("MyLinearLayout", "onTouchEvent");
        return super.onTouchEvent(event);
    }
}

public class MyButton extends Button {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i("MyButton", "dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i("MyButton", "onTouchEvent");
        return super.onTouchEvent(event);
    }
}

当我们点击Button时,输出的日志如下:

MyLinearLayout: dispatchTouchEvent
MyLinearLayout: onInterceptTouchEvent
MyButton: dispatchTouchEvent
MyButton: onTouchEvent
MyButton: dispatchTouchEvent
MyButton: onTouchEvent
MyLinearLayout: onTouchEvent

从日志中可以看到,Touch事件首先被传递到了MyLinearLayout中,然后MyLinearLayout在onInterceptTouchEvent方法中将该事件拦截并消费,最终Touch事件在MyLinearLayout中被处理掉了。

2. View的事件分发

在一个TextView中,我们注册了一个OnTouchListener。代码如下:

textView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("MyTextView", "onTouch");
        return false;
    }
});

当我们点击TextView时,输出的日志如下:

MyTextView: onTouch

从日志中可以看到,由于TextView并没有重写dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent方法,因此Touch事件并不会在TextView中被分发处理。同时,由于OnTouchListener的返回值为false,表示未处理Touch事件,该Touch事件会继续往下传递并最终被父View处理。最终,Touch事件在View中被处理掉了。

总结

通过这两个示例,我们可以更好地理解Touch事件分发的过程及机制。对于开发中遇到的Touch事件相关问题,我们可以更加快速、准确地排查问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android Touch事件分发过程详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • jssort方法根据数组中对象的某一个属性值进行排序

    jssort方法根据数组中对象的某一个属性值进行排序 在开发一个包含大量数据的网站时,我们通常需要对数据进行排序,以便更好地展示给用户。在 JavaScript 开发中,我们可以使用 jssort 方法来对数组中的对象进行排序。 什么是 jssort 方法 jssort 方法是 JavaScript 原生方法之一,用于对数组中的元素进行排序。它的语法格式如下…

    其他 2023年3月29日
    00
  • 基于Ionic3实现选项卡切换并重新加载echarts

    基于Ionic3实现选项卡切换并重新加载echarts的完整攻略 1. 简介 在Ionic3中实现选项卡切换并重新加载echarts可以通过以下步骤完成。首先,我们需要创建一个基本的Ionic3应用程序,并添加选项卡组件。然后,我们将使用echarts库来绘制图表,并在选项卡切换时重新加载图表数据。 2. 创建Ionic3应用程序 首先,确保你已经安装了No…

    other 2023年7月29日
    00
  • CentOS命令行性能检测工具详解

    下面是“CentOS命令行性能检测工具详解”的完整攻略: CentOS命令行性能检测工具详解 为什么要进行性能检测? 在实际的开发、测试、维护、部署等工作中,我们经常会需要对所运行的系统和应用进行性能检测,以评估其性能瓶颈、寻找优化方案等。而对于类Unix系统(如CentOS)中的命令行应用程序而言,我们可以通过一系列命令行工具进行性能检测,其中包括: to…

    other 2023年6月27日
    00
  • vba中timer函数

    vba中Timer函数 VBA是Microsoft Excel中使用的一种宏语言,通过编写宏代码,可以使Excel自动执行一些任务。其中,Timer函数是一个十分常用的函数之一,本文将为您介绍其具体使用方法。 Timer函数介绍 Timer函数是VBA中用于计算程序执行时间的函数。该函数返回的是从午夜12点到当前系统时间经过的秒数。Timer函数的语法如下:…

    其他 2023年3月28日
    00
  • android获取文件夹、文件的大小以b、kb、mb、gb为单位

    以下是“Android获取文件夹、文件的大小以B、KB、MB、GB为单位”的完整攻略: Android获取文件夹、文件的大小以B、KB、MB、GB单位 在Android中,我们可以使用Java的File类来获取文件夹、文件的大小。以下是使用Java的File类获取文件夹、文件大小的步骤: 1. 获取文件夹大小 我们可以使用以下代码获取文件夹的大小: publ…

    other 2023年5月7日
    00
  • mysql中的四大运算符种类实例汇总(20多项)

    MySQL 中的四大运算符种类,包括比较运算符、逻辑运算符、位运算符和赋值运算符。下面将对每种运算符进行详细讲解,包括其功能、用法和示例。 比较运算符 比较运算符用于比较两个值之间的大小关系,返回的结果是 TRUE 或 FALSE。下面是一些比较运算符的示例: 等于运算符(=):判断两个值是否相等。例如: SELECT * FROM student WHER…

    other 2023年6月27日
    00
  • Win10 Mobile正式版推送 升级版本号为10.0.10586.107

    以下是关于“Win10 Mobile 正式版推送,升级版本号为 10.0.10586.107”的完整攻略,包含了两个示例说明。 升级版本号 根据消息,Win10 Mobile 正式版的升级版本号确定为 10.0.10586.107。这意味着在推送升级时,Win10 Mobile 的版本号将从当前版本升级到 10.0.10586.107。 示例说明 示例一:W…

    other 2023年8月2日
    00
  • ajax data属性传值的方式总结

    Ajax数据属性传值的方式总结 在进行Web开发的过程中,使用 Ajax 可以实现网页间的异步交互。在绑定 Ajax 请求的处理函数时,通常需要将当前元素的某些属性或数据通过 Ajax 参数传递到后台处理。本文就介绍使用数据属性(data-*属性)这一常见方式进行 Ajax 数据传值。 什么是数据属性 数据属性是HTML5新增的全局属性之一,以 data- …

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部