Android中 onTouchEvent() 与 onInterceptTouchEvent()事件的区别详解
1.onTouchEvent:触发触摸事件
onInterceptTouchEvent:触发拦截触摸事件
通过查看源代码及类继承关系
onInterceptTouchEvent:是定义于ViewGroup里面的一个方法,此事件是用于拦截触摸事件的,ViewGroup(继承自View),一个View的Group,也就是我们的一个布局如LinerLayout,各个布局类都继承自ViewGroup;
onTouchEvent:是定义于View中的一个方法,处理传递到View的手势触摸事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件;
其中ViewGroup里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,ViewGroup里的onTouchEvent默认返回值是false;
View里的onTouchEvent默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouchEvent里返回值是true的时候,onTouch会继续调用ACTION_UP事件,如果onTouchEvent里返回值是false,那么onTouchEvent只会调用ACTION_DOWN而不调用ACTION_UP。
1、新建两个类LLayout , LView 如下
复制代码 代码如下:
public class LLayout extends FrameLayout {// ViewGroup@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {Log.i("LTAG", "LLayout onInterceptTouchEvent");Log.i("LTAG", "LLayout onInterceptTouchEvent default return" + super.onInterceptTouchEvent(ev));return super.onInterceptTouchEvent(ev);}// View@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i("LTAG", "LLayout onTouchEvent");Log.i("LTAG", "LLayout onTouchEvent default return" + super.onTouchEvent(event));return super.onTouchEvent(event);}
}
public class LView extends Button {// TextView <-- View@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i("LTAG", "onTouchEvent");Log.i("LTAG", "onTouchEvent default return" + super.onTouchEvent(event));return super.onTouchEvent(event);}
}
2、修改布局文件为如下布局
复制代码 代码如下:
<com.touchpro.LLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><com.touchpro.LViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/app_name" />
</com.touchpro.LLayout>
(1)先点击界面中的按钮
(2)再点击界面中的其它区域
结论:LLayout 中 onInterceptTouchEvent 默认返回值为false,onTouchEvent 默认返回值为false,所以只调用了ACTION_DOWN事件;
LView中 onTouchEvent 默认返回值为true;调用了ACTION_DOWN,ACTION_UP 两个事件;
(3)修改LLayout中onInterceptTouchEvent返回值为true,再次运行代码:
结论:LLayout中onInterceptTouchEvent返回了true,对触摸事件进行了拦截,所以没有将事件传递给View,而直接执行了LLayout中的onTouchEvent事件;
(4)把LLayout中onInterceptTouchEvent返回值改为false,再把LView中的onTouchEvent改为返回false:
结论:由于将LView中onTouchEvent返回值修改为false,因此只执行了ACTION_DOWN,然后就到LLayout中执行onTouchEvent事件了;
ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.
ViewGroup里的onTouchEvent默认值是false。
View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件。
通过log能看出他们的执行顺序,认真比较后就知道他们的区别在哪里了
Android中 onTouchEvent() 与 onInterceptTouchEvent()事件的区别详解相关推荐
- android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)
ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监 ...
- python frozenset_Python中set与frozenset方法和区别详解
set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元 ...
- html offsetwidth 字符串宽度,基于js中style.width与offsetWidth的区别(详解)
作为一个初学者,经常会遇到在获取某一元素的宽度(高度.top值...)时,到底是用 style.width还是offsetWidth的疑惑. 1. 当样式写在行内的时候,如 时,用 style.wid ...
- android datepicker使用方法,android中DatePicker和TimePicker的使用方法详解
本文以实例讲述了android中DatePicker和TimePicker的使用方法,具体步骤如下: 下面是实现具体功能的代码,其中main.xml代码为: android:layout_width= ...
- Android中List、Set、Map数据结构详解
Android中一般使用的数据结构有java中的基础数据结构List,Set,Map.还有一些Android中特有的几个,SparseArray(使用Map时Key是int类型的时候可以用这个代替)等 ...
- android中接口的作用是什么意思,详解Android接口Interface的使用和意义
本文介绍是Android的一个重要的东西,接口Interface,详解两个方面: (1)Java是继承的,接口Interface是可以多个的,恰恰弥补了这个缺点. (2)回调,接口Interface里 ...
- Android中Canvas绘图之Shader使用图文详解
概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...
- java中public_java中public class与class的区别详解
以下是对java中public class与class的区别进行了分析介绍,需要的朋友可以过来参考下 在编写类的时候可以使用两种方式定义类:public class定义类: class定义类:如果一个 ...
- android中进行https连接的方式的详解
比较不错的帖子哦 android Video Buffer傳輸流程 http://www.eoeandroid.com/thread-195728-1-1.html 利用反射机制,封装 SAX解析类, ...
最新文章
- 函数声明末尾的“ const”是什么意思? [重复]
- 新风系统风速推荐表_家用新风常用管道规格和对应风量推荐值
- Python学习笔记:Day13 提升开发效率
- java可存储100个整数的数组_定义一个一维整数数组,其中储存1000个1至100以内的整数,并统计出整数出现的次数(Java写出来)...
- GPC:使用GPC计算intersection容易出现的问题
- tensor也可以作为索引
- Consider defining a bean of type ‘java.lang.String‘ in your configuration
- 000 初步使用Kotlin开发Android应用
- LabelImg使用方法
- 林子雨_大数据技术原理与应用课后习题
- linux ansys14.0,linux 安装 ansys14
- azure linux root密码,Azure Linux 云主机使用Root超级用户登录
- Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java14 的新特性
- c语言 ppm 大小,PPM图像处理器
- pcf8563c语言程序,PCF8563T标准驱动源程序
- watch:{} 与 this.$watch() 一样
- kubernetes中的PV、PVC
- sql注入登陆(菜鸟级)
- Python读写zip压缩文件的方法
- 【机器学习基础】乡村F4带你入门线性回归 带python代码示例(一)