事件传递主要有以下的调用顺序 dispatchTouchEvent -->  onInterceptTouchEvent--> onTouchEvent 
一、主要用到以下几个事件
(1)public boolean dispatchTouchEvent(MotionEvent ev) : 主要做事件分发的作用,源码中会调用到了onInterceptTouchEvent()和onTouchEvent() 用于去判断事件是否需要分发;
当返回值为false时则表示此事件不做分发, dispatchTouchEvent 调用完后不再走下面的onInterceptTouchEvent   ,onTouchEvent ,为true时则根据 onInterceptTouchEvent ,onTouchEvent 去分发事件,走以下调用顺序 :dispatchTouchEvent -->  onInterceptTouchEvent--> onTouchEvent ;
(2)public boolean onInterceptTouchEvent(MotionEvent ev) :事件拦截,主要是用于拦截事件是否向下传递,当返回为false时,则事件往下传递,当返回为true时,事件则不向下传递。(继承与ViewGroup的子类才有改方法,继承于View的之类则没有此方法)
(3) public boolean onTouchEvent(MotionEvent event) : 事件消化,如果返回为true时则事件被消化掉,不再向父传递,若果返回为false则向父view传递
二、进行如下实验 ,写了三个自定义事件,继承于LinearLayout ,分别都重写他的三个事件传递方法;
public class MyView2 extends LinearLayout {

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

    @Override    public boolean onTouchEvent(MotionEvent event) {        Log.d("MyView0", "MyView2 onTouchEvent eventType = " + event.getAction() + " eventX = " + event.getX() + " eventY = " + event.getY());        return super.onTouchEvent(event);    }

    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        Log.d("MyView0","MyView2 onInterceptTouchEvent eventType = "+ev.getAction()+" eventX = "+ev.getX()+" eventY = "+ev.getY());        return super.onInterceptTouchEvent(ev);    }

    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        Log.d("MyView0","MyView2 dispatchTouchEvent eventType = "+ev.getAction()+" eventX = "+ev.getX()+" eventY = "+ev.getY());        return super.dispatchTouchEvent(ev);    }}

(1)、页面布局如下:

<?xml version="1.0" encoding="utf-8"?><com.prj.test.yan.eventTranslate.utils.MyView0        xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_height="match_parent"        android:layout_width="match_parent"        android:background="#ffffff"        android:orientation="vertical">    >    <com.prj.test.yan.eventTranslate.utils.MyView1            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_margin="50dp"            android:background="#538CCC"            android:id="@+id/myView1"            android:orientation="vertical"            >        <com.prj.test.yan.eventTranslate.utils.MyView2                android:layout_width="match_parent"                android:layout_height="match_parent"                android:layout_margin="50dp"                android:background="#2CA748"                android:id="@+id/myView2"                android:orientation="horizontal"                >            <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="测试"/>        </com.prj.test.yan.eventTranslate.utils.MyView2>    </com.prj.test.yan.eventTranslate.utils.MyView1></com.prj.test.yan.eventTranslate.utils.MyView0>
(2)进行以下实验:
a、在事件分发(dispatchTouchEvent)方法中拦截 :
1、MyView0 中返回false,则事件不再调用 onInterceptTouchEvent--> onTouchEvent ,点击任何部分都只拦截到了MyView0 的事件,不再往包裹的子view传递;
    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        Log.d("MyView0","MyView0 dispatchTouchEvent eventType = "+ev.getAction()+" eventX = "+ev.getX()+" eventY = "+ev.getY());          return false;//        return super.dispatchTouchEvent(ev);

    }

结果:

07-28 15:06:27.305  11933-11933/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 75.89459 eventY = 763.2896
07-28 15:06:28.313  11933-11933/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 153.7864 eventY = 759.2927
07-28 15:06:29.073  11933-11933/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 289.59778 eventY = 752.2982
2、MyView1 返回false
07-28 15:11:25.130  13289-13289/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 152.7878 eventY = 725.3193
07-28 15:11:25.130  13289-13289/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 152.7878 eventY = 725.3193
07-28 15:11:25.130  13289-13289/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 dispatchTouchEvent eventType = 0 eventX = 52.787796 eventY = 625.3193
07-28 15:11:25.130  13289-13289/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 152.7878 eventY = 725.3193
b、在onInterceptTouchEvent 中拦截
1、返回为true时则事件不再往子view传递
点击MyView0 的日志:
07-28 15:19:01.544  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 36.948685 eventY = 814.2498
07-28 15:19:01.544  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 36.948685 eventY = 814.2498
07-28 15:19:01.544  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 36.948685 eventY = 814.2498
点击MyView1 的日志:
07-28 15:20:05.999  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 183.7448 eventY = 633.3911
07-28 15:20:05.999  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 183.7448 eventY = 633.3911
07-28 15:20:05.999  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 183.7448 eventY = 633.3911
点击MyView2 的日志:
07-28 15:20:26.643  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 290.5964 eventY = 655.3739
07-28 15:20:26.643  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 290.5964 eventY = 655.3739
07-28 15:20:26.643  13700-13700/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 290.5964 eventY = 655.3739
1、返回为false时则事件往子view传递
点击MyView0的日志:
07-28 15:23:33.009  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 33.952843 eventY = 795.26465
07-28 15:23:33.009  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 33.952843 eventY = 795.26465
07-28 15:23:33.009  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 33.952843 eventY = 795.26465
点击MyView1的日志:
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 158.77948 eventY = 901.1819
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 158.77948 eventY = 901.1819
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 dispatchTouchEvent eventType = 0 eventX = 58.77948 eventY = 801.1819
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onInterceptTouchEvent eventType = 0 eventX = 58.77948 eventY = 801.1819
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onTouchEvent eventType = 0 eventX = 58.77948 eventY = 801.1819
07-28 15:23:57.900  14150-14150/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 158.77948 eventY = 901.1819
c、onTouchEvent 事件消化
1、当onTouchEvent 返回值为true 时则消化掉改事件,事件不再往上的父view传递
点击MyView1
07-28 15:38:32.993  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 165.76978 eventY = 715.3271
07-28 15:38:32.993  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 165.76978 eventY = 715.3271
07-28 15:38:32.993  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 dispatchTouchEvent eventType = 0 eventX = 65.769775 eventY = 615.3271
07-28 15:38:32.993  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onInterceptTouchEvent eventType = 0 eventX = 65.769775 eventY = 615.3271
07-28 15:38:32.993  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onTouchEvent eventType = 0 eventX = 65.769775 eventY = 615.3271
07-28 15:38:33.133  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 1 eventX = 165.76978 eventY = 715.3271
07-28 15:38:33.133  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 dispatchTouchEvent eventType = 1 eventX = 65.769775 eventY = 615.3271
07-28 15:38:33.133  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onTouchEvent eventType = 1 eventX = 65.769775 eventY = 615.3271
07-28 15:38:33.133  15091-15091/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 1 eventX = 165.76978 eventY = 715.3271
2、当onTouchEvent 返回值为false时则不消化掉改事件,事件往上的父view传递
点击MyView2 
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 dispatchTouchEvent eventType = 0 eventX = 335.534 eventY = 554.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onInterceptTouchEvent eventType = 0 eventX = 335.534 eventY = 554.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 dispatchTouchEvent eventType = 0 eventX = 235.534 eventY = 454.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onInterceptTouchEvent eventType = 0 eventX = 235.534 eventY = 454.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView2 dispatchTouchEvent eventType = 0 eventX = 135.534 eventY = 354.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView2 onInterceptTouchEvent eventType = 0 eventX = 135.534 eventY = 354.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView2 onTouchEvent eventType = 0 eventX = 135.534 eventY = 354.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView1 onTouchEvent eventType = 0 eventX = 235.534 eventY = 454.45276
07-28 15:45:20.928  15866-15866/com.prj.test.yan.eventTranslate D/MyView0﹕ MyView0 onTouchEvent eventType = 0 eventX = 335.534 eventY = 554.45276
总结如下:借用以下别人博文的两张图
dispatchTouchEvent ,onInterceptTouchEvent 主要用于事件的向下传递,

Android事件传递相关推荐

  1. 细说Android事件传递

    一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件 ...

  2. Android事件传递机制(转)

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  3. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...

    本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...

  4. android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...

    本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image ...

  5. Android 事件传递机制总结

    Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...

  6. android 时间传递,Android事件传递

    事件经过主要的三层,分别是Activity.Layout(多个).View 三者都拥有dispatchTouchEvent和onTouchEvent方法. dispatchTouchEvent是用来控 ...

  7. Android事件传递(分发)机制

    Android事件的构成: 在android中,事件主要包括点按,长按,拖拽,滑动等等,另外点按还包括点击和双击.所有这些都构成了android中的事件响应.总的来说所有的事件都由以下三个部分组成: ...

  8. Android事件传递机制【Touch事件】

    Android中提供了ViewGroup.View.Activity三个等级的Touch事件处理.也就是说,这三个地方都有事件回调方法. 测试DEMO视图结构: <com .orgcent.ev ...

  9. Android事件传递简单分析

    1.Activity事件处理 package com.example.eventdemo01;import androidx.appcompat.app.AppCompatActivity;impor ...

  10. Android事件传递可以这样理解

    前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...

最新文章

  1. solve Ax+By+C=0
  2. Useful websites for library
  3. ExtJS中如何根据combobox的选值,动态地决定组件的显隐?
  4. 华为交换机S3700清空配置方法
  5. C#合成解析XML与JSON
  6. 用Oracle归档日志进行恢复方法
  7. BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)
  8. 大白菜U盘启动盘手动去除捆绑第三方赞助软件
  9. PHP反序列化字符串溢出
  10. oc引导win方法_适配自己的OC引导一键生成Opencore Generation X使用指南
  11. cmd 卸载mysql_彻底卸载MySQL图文教程
  12. 如何脱控极域电子教室
  13. 测试鼠标宏软件,Mini Mouse Macro(鼠标宏设置工具)
  14. 如何删除剽悍的应用软件
  15. V2X消息之MAP消息解读
  16. 【推荐】时间管理文章:Do it now
  17. 平安科技Java开发三面面经(2018年12月)
  18. textarea回车符问题
  19. Django项目连接MongoDB的三种方法
  20. Block Design内部BRAM控制器与外部BRAM的连接

热门文章

  1. php获取今天星期几,PHP获取星期几的常用方法小结
  2. JQuery中三元运算
  3. Vue的生命周期的介绍
  4. 【青少年编程竞赛须知】青少儿学习编程能够参加哪些比赛?
  5. Exchange高危0day漏洞 -- 直接拿下你的域控和服务器 -- 立即行动!CVE-2021-26855
  6. 【C语言】size与strlen的区别解析
  7. dvb s2标准下载_ETSI EN 302 307-1
  8. Unity3D手机斗地主游戏开发实战(04)_出牌判断大小
  9. 导弹防御系统java_导弹防御问题 动态规划 java
  10. JavaScript高级程序设计[美]Nicholas C.Zakas著 读书笔记(三)