全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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点这里

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


# Android触摸事件传递  # Android触摸事件  # 简单讲解Android开发中触摸和点击事件的相关编程方法  # android中处理各种触摸事件的方法浅谈  # Android 的触摸事件详解及示例代码  # Android触摸事件如何实现笔触画布详解  # Android触摸事件传递机制  # Android触摸事件传递机制初识  # 关于Android触摸事件分发的原理详析  # 子类  # 重写  # 的是  # 点这里  # 是这样  # 没人  # 要注意  # 不存在  # 有几个  # 较多  # 只是一个  # 都已  # 会比  # 我们应该  # 我们必须  # 为了更好  # 大家多多  # 过程中  # 博文  # 在实际 


相关文章: c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  高防服务器租用如何选择配置与防御等级?  黑客入侵网站服务器的常见手法有哪些?  如何快速搭建虚拟主机网站?新手必看指南  建站主机助手选型指南:2025年热门推荐与高效部署技巧  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  金*站制作公司有哪些,金华教育集团官网?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  免费网站制作appp,免费制作app哪个平台好?  Android滚轮选择时间控件使用详解  公司网站制作需要多少钱,找人做公司网站需要多少钱?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  海南网站制作公司有哪些,海口网是哪家的?  高性价比服务器租赁——企业级配置与24小时运维服务  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何用AWS免费套餐快速搭建高效网站?  建站之星如何开启自定义404页面避免用户流失?  如何用5美元大硬盘VPS安全高效搭建个人网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  ,sp开头的版面叫什么?  建站之星在线客服如何快速接入解答?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何快速登录WAP自助建站平台?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  北京网站制作网页,网站升级改版需要多久?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  建站主机如何选?高性价比方案全解析  如何快速启动建站代理加盟业务?  建站之星客服服务时间及联系方式如何?  如何确认建站备案号应放置的具体位置?  建站之星后台密码如何安全设置与找回?  建站主机SSH密钥生成步骤及常见问题解答?  表情包在线制作网站免费,表情包怎么弄?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何彻底卸载建站之星软件?  建站之星上传入口如何快速找到?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  建站之星安装需要哪些步骤及注意事项?  如何正确选择百度移动适配建站域名?  宿州网站制作公司兴策,安徽省低保查询网站?  网站制作服务平台,有什么网站可以发布本地服务信息?  安徽网站建设与外贸建站服务专业定制方案  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  建站之星备案流程有哪些注意事项? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。