技术库 > Java

Android Activity 和 ViewGroup中事件触发和传递机制

技术库:tec.5lulu.com

1 在只有Activity的情况

from:tec.5lulu.com

1)Touch事件触发流程:

       首先触发dispatchTouchEvent

       然后触发onUserInteraction

       再次onTouchEvent

       如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up)

       触发dispatchTouchEvent

       再次onTouchEvent

       当ACTION_up事件时不会触发onUserInteraction(可查看源代码)

2)键盘事件触发流程:

       首先触发dispatchKeyEvent

       然后触发onUserInteraction

       再次onKeyDown

       如果按下紧接着松开,则是俩步

       紧跟着触发dispatchKeyEvent

       然后触发onUserInteraction

       再次onKeyUp

       注意与触摸不同,当松开按键时onUserInteraction也会触发。

       总之:  Activity.dispatchTouchEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。(同理 dispatchKeyEvent)

2 Activity里有一个Layout,在Layout里有个按钮情况

       如果在按钮上触发一个CLICK事件,那么事件传递流程:

       首先触发ACTIVITY的dispatchTouchEvent

       然后触发ACTIVITY的onUserInteraction

       然后触发LAYOUT的dispatchTouchEvent

       然后触发LAYOUT的onInterceptTouchEvent

       然后触发BUTTON的onTouch(这是一个ACTION_DOWN事件)

       紧跟着是一个ACTION_UP事件

       触发ACTIVITY的dispatchTouchEvent

       注意不再触发ACTIVITY的onUserInteraction,因为他对ACTION_UP不起作用。

       然后触发LAYOUT的dispatchTouchEvent

       然后触发LAYOUT的onInterceptTouchEvent

       然后触发BUTTON的onTouch

       最后触发BUTTON的onClick.

       如果你在ONTOUCH事件里返回true,消费了此事件,那么ONCLICK将不会被响应

       但是如果你不写ONCLICK事件,而ONTOUCH事件返回FLASE

3 总结

       Android事件触发流程:

-------------------------------------------------------------------

       首先触发ACTIVITY的dispatchTouchEvent

       然后触发ACTIVITY的onUserInteraction

       然后触发LAYOUT的dispatchTouchEvent

       然后触发LAYOUT的onInterceptTouchEvent

-------------------------------------------------------------------

       在ViewGroup(即上面Layout)情况特别分析:

       针对由于触摸(Touch)而触发的事件。

       Android的事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN, 表示按下了屏幕。之后,touch将会有后续事件,可能是:

       ACTION_MOVE //表示为移动手势

       ACTION_UP //表示为离开屏幕

       ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序产生的

       一个Action_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。

       Android中,有一类控件是中还可以包含其他的子控件,这类控件是继承于ViewGroup类,例如:ListView, Gallery, GridView。

       还有一类控件是不能再包含子控件,例如:TextView。

       本文的主要讨论对象就是ViewGroup类的控件嵌套时事件触发情况。

       对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View继续传递,这个方法是从父View向子View传递。

       而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。

       Touch事件在 onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去(只是传递方向不一样,onInterceptTouchEvent()向子View传,而onTouchEvent()向父View传)。

       具体情况如下:

       ACTION_DOWN事件会传到某个ViewGroup类的onInterceptTouchEvent,如果返回false,则DOWN事件继续向子ViewGroup类的onInterceptTouchEvent传递,如果子View不是ViewGroup类的控件,则传递给它的onTouchEvent。

       如果onInterceptTouchEvent返回了true,则DOWN事件传递给它的onTouchEvent,不再继续传递,并且之后的后续事件也都传递给它的onTouchEvent。

       如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent继续处理。(后续事件只会传递给对于必要事件ACTION_DOWN返回了true的onTouchEvent)

       总结一下就是:onInterceptTouchEvent可以接受到所有的Touch事件,而onTouchEvent则不一定。

Android Activity 和 ViewGroup中事件触发和传递机制


标签: activity 事件本文链接 http://tec.5lulu.com/detail/110kzn1h9g15l8y9c.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com