HardBirch

Android关于OnTouch的最新总结

时间:14-04-17 栏目:android学习笔记 作者:鲁智森也有文化 评论:1 点击: 5,052 次

关于Ontouch你是否有如下疑问?

onTouch 和onTouchEvent之间什么关系?
TextView 为什么需要dispatchEvent函数? 没有为甚么的,dispatchEvent会负责调用onTouchEvent
自定义ViewGroup内部的view 和 包含在ViewGroup中的View接收事件先后顺寻?

onClick事件是如何传递的
正常的Touch事件传递顺序是怎样的?
dispatchTouchEvent返回值表示什么
onTouchEvent返回值表示什么
onInterupterTouchEvent 返回值表示什么

关于这几个流程,你是必须要掌握清楚

Touch事件的传递流程:
Touch事件被拦截后,流程:
down事件被consume之后,后续move和up的传递流程:
Touch事件被拦截后,后续move和up的传递流程:

 

默认处理流程(以ACTION_DOWN事件为例):

 

当触摸事件ACTION_DOWN发生之后,先调用Activity中的dispatchTouchEvent函数进行处理,紧接着 ACTION_DOWN事件传递给ViewGroup中的dispatchTouchEvent函数,接着viewGroup中的 dispatchTouchEvent中的ACTION_DOWN事件传递到调用ViewGroup中的onInterceptTouchEvent函 数,此函数负责拦截ACTION_DOWN事件。由于viewGroup下还包含子View,所以默认返回值为false,即不拦截此 ACTION_DOWN事件。如果返回false,则ACTION_DOWN事件继续传递给其子view。由于子view不是viewGroup的控件, 所以ACTION_DOWN事件接着传递到onTouchEvent进行处理事件。此时消息的传递基本上结束。从上可以分析,motionEvent事件 的传递是采用隧道方式传递。隧道方式,即从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。

接下来继续分析,事件的处理。刚才ACTION_DOWN事件传递到view的onTouchEvent函数中处理了,默认是返回true,接着 view的dispatchTouchEvent返回true,再接着viewGroup的dispatchTouchEvent返回true,最后 Activity的dispatchTouchEvent返回true。我们发现,motionEvent事件的处理采用冒泡方式。冒泡方式,从最内层子 元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。

 

依据上述流程,总结如下:
(1)onInterupterTouchEvent 返回false,调用下层view的dispatchTouchEvent(),返回true调用view自己的onTouchEvent(),
相当于bypass调用下层view的onTouchEvent(),所以起到拦截touchEvent的作用。

(2)onTouchEvent返回true,说明view需要处理这个event;

(3)dispatchTouchEvent返回true,dispatchTouchEvent默认是返回onTouchEvent()的返回值,告诉上层view当前view及下层view
有没有consume 这个touchEvent,所以不建议自己去手动制造返回值。所以强制返回true,会被上层view误解成touchEvent被其consume

============================================================
1.ACTION_MOVE ACTION_UP是要在consume ACTION_DOWN之后才会来;
2.ACTION_DOWN 到来会直接发给对应VIEW的 onTouchEvent,不会经过onInterceptTouchEvent;
3.onTouchEvent和onInterceptTouchEvent 是在 dispatchTouchEvent函数被调的;
4.dispatchTouchEvent通常的返回值是onTouchEvent的返回值,表示了这个事件有没有被consume,不建议人为的设为true或者false;
5.事件发生的时候是从Activity的dispatchTouchEvent开始传递的,Activity不管有没有consume都能接收到ACTION_MOVE ACTION_UP;
6.某个view consume ACTION_DOWN 之后,Activity的onTouchEvent无法收到ACTION_DOWN,后续的ACTION_MOVE ACTION_UP也不会到来。
7.某个view consume ACTION_DOWN 之后,ACTION_MOVE和ACTION_UP处理流程
8.在没有拦截的情况下,包含触控点的控件都会收到touchEvent(onTouchEvent都会收到事件)。
9.在拦截的情况下,下层的view会无法收到onTouchEvnet函数的调用;
10.
11.在拦截的情况下,下层的view会收到ACTION_CANCEL事件;
12.

声明: 本文由( 鲁智森也有文化 )原创编译,转载请保留链接: Android关于OnTouch的最新总结

Android关于OnTouch的最新总结:目前有1 条留言

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐