栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

View的Touch事件分发(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

View的Touch事件分发(一)

Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发。

一次完整的Touch事件序列为:

ACTION_DOWN -> ACTION_MOVE -> ACTION_UP

对于Touch事件的分发,不管是View还是ViewGroup都和以下的三个方法有关系:

dispatchTouchEvent():事件分发

onInterceptTouchEvent():事件拦截(ViewGroup才有该方法,View没有)

onTouchEvent():事件消费

现象:给一个控件设置OnTouchListener和OnClickListener,点击控件,会有以下3种结果:

1.OnTouchListener,OnTouchEvent,OnClickListener三个都有的情况下,OnTouchListener返回false :

OnTouchListener.DOWN -> OnTouchEvent.DOWN -> OnTouchListener.MOVE

-> OnTouchEvent.MOVE -> OnTouchListener.UP -> OnTouchEvent.UP -> OnClickListener

View的事件调度顺序是dispatchTouchEvent() -> onTouchListener() -> onTouchEvent() -> onLongCLick() -> onClick()

2.OnTouchListener,OnTouchEvent,OnClickListener三个都有的情况下 ,OnTouchListener返回true :

OnTouchListener.DOWN -> OnTouchListener.MOVE -> OnTouchListener.UP

只执行OnTouchListener,后续都不执行

3.OnTouch,OnClickListener前提是OnTouchEvent返回true :

OnTouchEvent.DOWN -> OnTouchEvent.MOVE -> OnTouchEvent.UP

不会执行OnClickListener

结论:

1.onTouchListener()的onTouch()方法的执行是优先于View的onTouchEvent()方法。

2.OnTouchListener的onTouch()方法返回了true,表示消费了touch事件,后续View的onTouchEvent(),onClick(),onLongClick()也就不会再执行了。

3.onClick(),onLongClick()等方法都是在onTouchEvnet()方法中进行执行的,ACTION_DOWN中处理长点击onLongClick(),ACTION_UP中处理点击onClick()。

4.如果View是未激活的,即处于DISABLED状态但是是可点击的(CLICKABLE LONG_CLICKABLE CONTEXT_CLICKALE),此时view也会消费掉touch事件,但是不会响应OnClickListener的onClick()方法,onLongClickListener的onLongCLick()方法

5.只要是View可点击的并且处于ENABLED状态,就一定返回true,即一定会消费touch事件。

6.onTouch(),onTouchEvent()中事件是否被消费了,由方法的返回值来决定,而不是由我们是否在方法中使用了touch事件MotionEvent来决定的。

后续会从源码来分析整个View的Touch事件分发过程

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号