androidmotionevent事故响应机制

yizhihongxing

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日

相关文章

  • 添加学生信息(Javaweb)

    添加学生信息(Javaweb)的完整攻略 本文将为您详细讲解如何在Javaweb中添加学生信息,包括前端页面设计、后端代码实现、数据库操作等内容。 前端页面设计 在Javaweb中,可以使用JSP和Servlet等技术来实现前端页面设计。以下是添加学生信息的前端页面设计示例: <!DOCTYPE html> <html> <he…

    other 2023年5月6日
    00
  • 如何使用getoptions实用程序在perl中处理“可选”命令行参数

    以下是关于如何使用Getopt::Long模块在Perl中处理“可选”命令行参数的完整攻略,包含两个示例。 如何使用Getopt::Long模块Perl中处理“可选”命令行参数 在Perl中,我们可以使用Getopt::Long模块来处理“可选”命令行参数。以下两个示例: 1. 处理单个可选参数 use Getopt::Long; my $verbose =…

    other 2023年5月9日
    00
  • VS2010中 为图片添加背景图片

    VS2010中 为图片添加背景图片 在使用VS2010进行Windows程序开发时,经常会需要使用图片资源。有时为了美观或展示效果,需要为图片添加背景图片。下面我们就来详细介绍一下VS2010的图片控件如何添加背景图片。 1.创建PictureBox控件 首先,在VS2010的设计界面中创建一个PictureBox控件。右键单击该控件,在弹出菜单中选择“属性…

    其他 2023年3月28日
    00
  • Java 的访问修饰符public,protected,private(封装、继承)

    关于Java的访问修饰符public、protected、private,涉及封装、继承的相关知识点,下面为您详细演示: 1. Java中的访问修饰符 Java提供了4种访问修饰符,分别是: public:公共的,可以被所有类访问,无访问限制。 protected:受保护的,只能被本类、同包内以及其它包中的子类访问。 default:(没有修饰符)默认的,在…

    other 2023年6月25日
    00
  • swift调用oc方法

    当然,我可以为您提供有关“Swift调用OC方法”的完整攻略,以下是详细说明: Swift调用OC方法 在Swift中,可以通过桥接文件(Bridging Header)来调用OC方法。桥接文件是一个,用于将Swift代码和OC代码连接起来。以下是详细步骤: 创建桥文件 在Swift项目中,创建一个名“项目名]-Bridging-Header.h”的头文件,…

    other 2023年5月7日
    00
  • Python中变量的作用域的具体使用

    Python中变量的作用域的具体使用攻略 在Python中,变量的作用域指的是变量在程序中的可见性和访问范围。了解变量的作用域对于编写可维护和可扩展的代码非常重要。本攻略将详细讲解Python中变量作用域的具体使用。 1. 全局作用域 全局作用域是指在整个程序中都可见的变量。在任何函数内部都可以访问全局作用域中的变量。 示例1: x = 10 # 全局变量 …

    other 2023年7月29日
    00
  • JetBrains全家桶汉化包安装教程 附中文包下载地址

    JetBrains全家桶汉化包安装教程 本教程将详细讲解如何安装JetBrains全家桶汉化包,并提供中文包下载地址。JetBrains全家桶是一套集成开发环境(IDE)工具,包括IntelliJ IDEA、PyCharm、WebStorm等。 步骤一:下载中文包 首先,我们需要下载适用于你所使用的JetBrains全家桶版本的中文包。你可以从以下地址下载中…

    other 2023年8月5日
    00
  • ubuntu查看mysql版本

    以下是“Ubuntu查看MySQL版本的完整攻略”的标准markdown格式文本,其中包含了两个示例: Ubuntu查看MySQL版本的完整攻略 在Ubuntu系统中,我们可以通过命令行来查看MySQL的版本号。以下是查看MySQL版本号的步骤: 1. 登录MySQL 在命令行中输入以下命令并按下回车键,输入MySQL的root用户密码以登录MySQL: m…

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