事件传递主要有以下的调用顺序 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事件传递相关推荐
- 细说Android事件传递
一.View的dispatchTouchEvent和onTouchEvent 探讨Android事件传递机制前,明确android的两大基础控件类型:View和ViewGroup.View即普通的控件 ...
- Android事件传递机制(转)
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...
- android touch机制,细说Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)...
本文背景:前些天用到了之前写的自定义图片文字复合控件,在给他设置监听时遇到了麻烦.虽然最后解决了问题,但发现在不重写LinearLayout的onInterceptTouchEvent时,子Image ...
- Android 事件传递机制总结
Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...
- android 时间传递,Android事件传递
事件经过主要的三层,分别是Activity.Layout(多个).View 三者都拥有dispatchTouchEvent和onTouchEvent方法. dispatchTouchEvent是用来控 ...
- Android事件传递(分发)机制
Android事件的构成: 在android中,事件主要包括点按,长按,拖拽,滑动等等,另外点按还包括点击和双击.所有这些都构成了android中的事件响应.总的来说所有的事件都由以下三个部分组成: ...
- Android事件传递机制【Touch事件】
Android中提供了ViewGroup.View.Activity三个等级的Touch事件处理.也就是说,这三个地方都有事件回调方法. 测试DEMO视图结构: <com .orgcent.ev ...
- Android事件传递简单分析
1.Activity事件处理 package com.example.eventdemo01;import androidx.appcompat.app.AppCompatActivity;impor ...
- Android事件传递可以这样理解
前言 关于Android中事件传递机制早已是老生常谈的话题,甭管工作多久水平咋样应该都能道出一二.依稀记得刚接触事件分发那会,一股脑的钻进网络上那几张神图,什么三大方法.职责链,最后再巴拉巴拉贴一大堆 ...
最新文章
- solve Ax+By+C=0
- Useful websites for library
- ExtJS中如何根据combobox的选值,动态地决定组件的显隐?
- 华为交换机S3700清空配置方法
- C#合成解析XML与JSON
- 用Oracle归档日志进行恢复方法
- BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)
- 大白菜U盘启动盘手动去除捆绑第三方赞助软件
- PHP反序列化字符串溢出
- oc引导win方法_适配自己的OC引导一键生成Opencore Generation X使用指南
- cmd 卸载mysql_彻底卸载MySQL图文教程
- 如何脱控极域电子教室
- 测试鼠标宏软件,Mini Mouse Macro(鼠标宏设置工具)
- 如何删除剽悍的应用软件
- V2X消息之MAP消息解读
- 【推荐】时间管理文章:Do it now
- 平安科技Java开发三面面经(2018年12月)
- textarea回车符问题
- Django项目连接MongoDB的三种方法
- Block Design内部BRAM控制器与外部BRAM的连接
热门文章
- php获取今天星期几,PHP获取星期几的常用方法小结
- JQuery中三元运算
- Vue的生命周期的介绍
- 【青少年编程竞赛须知】青少儿学习编程能够参加哪些比赛?
- Exchange高危0day漏洞 -- 直接拿下你的域控和服务器 -- 立即行动!CVE-2021-26855
- 【C语言】size与strlen的区别解析
- dvb s2标准下载_ETSI EN 302 307-1
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小
- 导弹防御系统java_导弹防御问题 动态规划 java
- JavaScript高级程序设计[美]Nicholas C.Zakas著 读书笔记(三)