androidmotionevent事故响应机制

Android MotionEvent 事件响应机制

Android中的MotionEvent是指用户在屏幕上的触摸事件,包括按下、移动、抬起等操作。在Android中,MotionEvent事件响应机制是指当触屏幕时,系统如何处理这些事件并响应用户的操作。本攻略将介绍Android中的MotionEvent事件响应机制,包括发、事件拦截和处理等内容。

事件分发

在Android中,当用户触摸屏幕时,系统会将触摸事件分发给当前屏幕上的所有View,以便它们能够响应用户的操作。事件分发的过程是从外向内逐层遍历View树的过程,直找到最终的目标View。

事件分发的过程包括以下几个步骤:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    // 事件分发
    boolean handled = false;
    if (onInterceptTouchEvent(ev)) {
        handled = onTouchEvent(ev);
    } else {
        handled = child.dispatchTouchEvent(ev);
    }
    return handled;
}
  1. 系统将触摸事件传递给Activity的dispatchTouchEvent()方法。
  2. dispatchTouchEvent()方法将事件传递给根ViewGroup的dispatchTouchEvent()方法。
  3. dispatchTouchEvent()方法将事件传递给子View的dispatchTouchEvent方法
  4. 如果子View没有消费事件,则将事件传递给父View的dispatchTouchEvent()方法。
  5. 如果父View也没有消费事件,则将事件传递给Activity的onTouchEvent()方法。

在事件分发的过程中,如果某个View消费了事件,则后续的事件将不再传递给其他View。

事件拦截

在Android中,事件拦截是指当某个View拦截了事件后,后续的事件将不再传递给其他View。事件拦截的过程是在事件分发的过程中进行的。

事件拦截的过程包括以下几步骤:

@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {
    事件拦截
    boolean intercepted = false;
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        intercepted = false;
    } else {
        intercepted = true;
    }
    return intercepted;
}
  1. 系统将触摸事件传递给Activity的dispatchTouchEvent()方法。
  2. dispatchTouchEvent()方法将事件传递给根ViewGroup的dispatchTouchEvent()方法。
  3. dispatchTouchEvent()方法将事件传递给子View的dispatchTouchEvent()方法。
  4. 子View需要拦截事件,则将事件传递给子View的onInterceptTouchEvent()方法。
  5. 如果子View拦了事件,则后续的事件将不再传递给其他View。
  6. 如果子View没有拦截事件,则将事件传递给子View的onTouchEvent()方法。
  7. 如果子View没有消费事件,则将事件传递给父View的dispatchTouchEvent()方法。
  8. 如果父View也没有消费事件,则将事件传递给Activity的onTouchEvent()方法。

在事件拦截的过程中,如果某个View拦截了事件,则后续的事件将不再递给其他View。

事件处理

在Android中,事件处理是指当某个View消费了事件后,对事件相应的处理。事件处理的过程是在事件分发的过程中进行的。

事件处理的过程包括以下几个步骤:

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // 事件处理
    boolean handled = false;
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            handled = true;
            break;
        case MotionEvent.ACTION_MOVE:
            handled = true;
            break;
        case MotionEvent.ACTION_UP:
            handled = true;
            break;
    }
    return handled;
}
  1. 系统将摸事件传递给Activity的dispatchTouchEvent()方法。
  2. dispatchTouchEvent()方法将事件传递给根ViewGroup的dispatchTouchEvent()方法。
  3. dispatchTouchEvent()方法将事件传递给子View的dispatchTouchEvent()方法。
  4. 如果子View需要截事件,则将事件传递给View的onInterceptTouchEvent()方法。
  5. 如果子View拦截了事件,则将事件传递给子View的onTouchEvent()方法。
  6. 如果子View消费了事件,则事件处理结束。
  7. 如果子View没有费事件,则将事件传递给父View的dispatchTouchEvent()方法。
  8. 如果父View也没有消费事件,则将事件传递给Activity的onTouchEvent()方法。

在事件处理的过程中,如果某个View消费了事件,则后续的将不再传给其他View。

示例说明

以下是两个关于Android MotionEvent事件响应机制的示例:

示例一

在这个示例中,我们创建一个自定义ViewGroup,并在其中添加两个子View。我们将重写dispatchTouchEvent()方法和onTouchEvent()方法,以便在分发和事件处理过程中输出日志信息。

class MyViewGroup extends ViewGroup {
    private static final String TAG = "MyViewGroup";

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

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.d(TAG, "dispatchTouchEvent: " + ev.getAction());
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        Log.d(TAG, "onTouchEvent: " + ev.getAction());
        return super.onTouchEvent(ev);
    }

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

在上面的示例中,我们重写了dispatchTouchEvent()on()方法,并在这两个方法中输出了日志信息。当用户触摸屏幕时,系统会将触摸事件分发给MyViewGroup,并在事件分发和事件处理过程中输出日志信息。

示例二

在这个示例中,我们将创建一个定义View,并在其中重写onTouchEvent()方法,以便在事件处理过程中输出日志信息。

public class MyView extends View {
    private static final String TAG = "MyView";

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

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

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        Log.d(TAG, "onTouchEvent: " + ev.getAction());
        return true;
    }
}

在上面的示例中,我们重写了onTouchEvent()方法,并在这个方法中输出了日志信息。当用户触屏幕时,系统会将触摸事件传递给MyView,并在事件过程中输出日志信息。

注意事项

在使用 MotionEvent事件响应机制时需要注意以下点:

  • 事件分发、事件拦截和事件处理是在事件分发的过程中进行的。
  • 如果某个View消费了事件,则后续的事件将不再递给其他View。
  • 如果某个View拦截了事件,则后续的事件将不再传递给其他View。

结论

Android MotionEvent响应机制是指当用户触摸屏幕时,系统如何处理这些事件并响应用户的操作。事件分发、事件拦截和事件处理是在事件分发的过程中进行的。如果某个View消费了事件,则后续的将不再传给View。如果某个View拦截了事件,则后续的事件将不再递给其他View。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:androidmotionevent事故响应机制 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月8日

相关文章

  • 如何在vite初始化项目中安装scss以及scss的使用

    在Vite初始化项目中安装SCSS以及SCSS的使用攻略 安装SCSS 首先,确保你已经安装了Node.js和npm。你可以在终端中运行以下命令来检查它们的版本: node -v npm -v 使用Vite初始化一个新项目。在终端中运行以下命令: npm init vite@latest my-project –template blank 进入项目目录:…

    other 2023年8月9日
    00
  • 微信小程序中的数据存储实现方式

    title: ‘Learn WeChat Mini Program’, completed: false }, success: function(res) { console.log(res); // 输出:{ _id: ‘xxx’, errMsg: ‘collection.add:ok’ } }}); // 从数据库中查询数据db.collection(…

    other 2023年7月29日
    00
  • mysql 5.6.23 安装配置环境变量教程

    MySQL 5.6.23 安装配置环境变量教程 MySQL 是一种热门的关系型数据库管理系统。该软件最新版本是 MySQL 8.0,但如果你需要使用 MySQL 5.6.23 版本,我们可以通过以下步骤进行安装和配置。 步骤一:下载并安装 MySQL 5.6.23 访问 MySQL 官网下载中心 https://downloads.mysql.com/arc…

    other 2023年6月27日
    00
  • MySQL数据库grant授权命令

    MySQL数据库grant授权命令 在MySQL数据库中,grant命令用于对数据库或表格进行授权操作,授权用户访问或修改数据库的权限,主要包括以下几个方面: 对哪个数据库或表格进行授权 授权谁(用户名) 给予何种权限 从哪个主机可以连接到MySQL服务器 下面我们将详细介绍MySQL数据库grant授权命令的使用方法。 grant授权命令语法格式 GRAN…

    其他 2023年3月28日
    00
  • Unix系统中目录的操作命令总结

    当我们使用Unix操作系统时,目录的操作命令是非常基础和重要的一部分。在本文中,我们将讲解Unix系统中目录的操作命令总结,帮助读者更好地掌握这个知识点。 创建目录 我们可以使用以下命令创建一个新的目录: mkdir [目录名] 例如,如果我们要创建一个名为“mydir”的目录,我们可以运行以下命令: mkdir mydir 查看目录内容 我们可以使用以下命…

    other 2023年6月26日
    00
  • Linux中网络管理命令ipconfig与route的基本使用教程

    Linux中网络管理命令ipconfig与route的基本使用教程 在Linux系统中,网络管理是非常重要的一项任务。ipconfig和route是两个常用的命令,用于配置和管理网络接口和路由表。下面是它们的基本使用教程。 ipconfig命令 ipconfig命令用于配置和管理网络接口。以下是ipconfig命令的基本用法: ipconfig [选项] […

    other 2023年7月30日
    00
  • js插件dropload上拉下滑加载数据实例解析

    JS插件Dropload上拉下滑加载数据实例解析 什么是Dropload插件? Dropload是一款基于jQuery开发的下拉和上拉刷新的插件。该插件可以实现在列表或弹出层中,通过上拉或下拉手势来加载更多的数据。 如何使用Dropload插件? 首先,需要在页面中引入jquery和dropload的js文件,然后在页面中初始化dropload,如下所示: …

    other 2023年6月25日
    00
  • Android Touch事件分发过程详解

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

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部