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

陌路散爱 提交于 2020-03-30 02:24:28

在Android中,Activity和View都能接收触摸和按键事件,如果响应事件只需要在继承类里复写事件函数即可。

1.在只有Activity的情况:

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

以上摘录:http://blog.csdn.net/G_rrrr/article/details/4861189  

3.总结:

Android事件触发流程:

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

首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

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

查看:http://hi.baidu.com/lck0502/blog/item/7eeb452a846ff196023bf654.html

=================================================================================================================

在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则不一定。

以上摘录自:http://www.cnblogs.com/kingcent/archive/2011/03/08/1977059.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!