热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android触摸事件传递图解

这篇文章主要一图文结合的方式为大家详细介绍了Android触摸事件传递,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本博文讲解流程

TouchEvent相关事件简介
流程图分解讲解
总结与归纳

一.TouchEvent相关事件简介

 android TouchEvent相关事件有
 1 dispatchTouchEvent 这个方法用来分发TouchEvent
 2 onInterceptTouchEvent 这个方法用来拦截TouchEvent
 3 onTouchEvent 方法用来处理TouchEvent

比较特殊一点的是onInterceptTouchEvent 事件,在activity中和view中是没有这个这个事件的,因为activity本身只是一个容器或者载体,不存在对事件拦截,而view本身就是一个事件的最小单元,或最小子类,没有可以拦截的子类事件,所以他们是没有onInterceptTouchEvent事件,只有dispatchTouchEvent和onTouchEvent事件。

二.流程图分解讲解

为了更好的理解触摸事件的整个传递机制我根据事件传递绘制了一张流程图,来帮助大家理解。![这里写图片描述]

本图主要包含三层,即activity viewGroup view,按照事件的传递逐级传递。有几个要点要注意,
1.dispatchTouchEvent如果处理了本次事件,

那么他的执行顺序是这样的。这里是viewGroup的dispatchTouchEvent处理了本次事件
2.onTouchEvent 如果子view的TouchEvent没有处理本次事件,那么该事件会依次向上传递,知道有人处理,如果一直传递到activity 的onTouchEvent还是没人处理,默认本次事件结束.

核心代码

1. Activity

  public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  }
  String tag = "MainActivity";

  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    String tag1 = "dispatchTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println(tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println(tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println(tag + tag1 + "ACTION_UP");
        break;

    }
    return super.dispatchTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    String tag1 = "onTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println(tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println(tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println(tag + tag1 + "ACTION_UP");
        break;

    }
    return false;
  }



}

2.viewGroup

public class MyViewGroup extends ViewGroup {



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

  public MyViewGroup(Context context, AttributeSet attrs) {

    super(context, attrs);
  }
  String tag = "MyViewGroup";

  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    String tag1 = "dispatchTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println("------>"+tag +"-->"+ tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println("------>"+tag + tag1 + "ACTION_UP");
        break;

    }
    return super.dispatchTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    String tag1 = "onTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println("------>"+tag + tag1 + "ACTION_UP");
        break;

    }
    return super.onTouchEvent(event);
  }

  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    String tag1 = "onInterceptTouchEvent";
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println("------>"+tag + tag1 + "ACTION_UP");
        break;

    }
    return super.onInterceptTouchEvent(ev);
  }


}

3.view

public class MyButton extends Button {

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

    super(context, attrs);
  }

  String tag = "MyButton";

  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    String tag1 = "dispatchTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println("------>"+tag + tag1 + "ACTION_UP");
        break;

    }
    return super.dispatchTouchEvent(event);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    String tag1 = "onTouchEvent";
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        System.out.println("------>"+tag + tag1 + "ACTION_DOWN");
        break;
      case MotionEvent.ACTION_MOVE:
        System.out.println("------>"+tag + tag1 + "ACTION_MOVE");
        break;
      case MotionEvent.ACTION_UP:
        System.out.println("------>"+tag + tag1 + "ACTION_UP");
        break;

    }
    return false;
  }
}

以上只是部分代码,但是所有事件都已列出。

总结与归纳

通过以上学习我们应该可以更加深刻的理解事件的传递机制,但是在实际的开发过程中可能我们并不会全部用到,但是我们必须知道他的运行传递原理,这样遇到特殊的业务需求时,才不会出现卡壳,实际开发中我们多只要重写onTouchEvent事件就已经能够满足需要,但是如果要重写其他事件,我们就要考虑更周到些,牵扯的会比较多。

demo点这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • Lua编程进阶:数组与迭代器详解
    本文深入探讨了Lua语言中的数组和迭代器,通过实例讲解了一维数组、多维数组的使用方法及迭代器的工作原理。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • Matlab 实现工程与科学问题 - 第三章个人解析
    作为一名在读大学生,本文分享了我对《工程与科学中的Matlab应用》第三章习题的个人解决方案。欢迎通过私信或评论进行交流和讨论,但不接受任何形式的权威指导。文中提供了详细的代码实现,旨在促进学习和共同进步。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 前言Git是目前最流行的版本控制系统,在它的基础之上,GitHub和GitLab成为当前最流行的代码托管平台,它们均提供的代码评审、项目管理、持续集成等功能,越来越多的互联网企业都 ... [详细]
author-avatar
mobiledu2502937981
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有