技术库 > Java

android 事件处理

技术库:tec.5lulu.com

from:tec.5lulu.com

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

       但是对于VIEW来说,我们如果不改变DRAW,不需要继承,所以如果想响应事件,则需要

       当一个视图(如一个按钮)被触摸时,该对象上的 onTouchEvent() 方法会被调用。不过,为了侦听这个事件,你必须扩展这个类并重写该方法。很明显,扩展每个你想使用的视图对象(只是处理一个事件)是荒唐的。这就是为什么视图类也包含了一个嵌套接口的集合,这些接口含有实现起来简单得多的回调函数。这些接口叫做事件侦听器 event listeners ,是用来截获用户和你的界面交互动作的“门票”。

1.只有一个ACTIVITY得情况:

       当鼠标键按下时(即触摸)

       首先触发dispatchTouchEvent

       然后触发onUserInteraction

       再次onTouchEvent

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

       触发dispatchTouchEvent

       再次onTouchEvent

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

       当键盘按下时

       首先触发dispatchKeyEvent

       然后触发onUserInteraction

       再次onKeyDown

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

       紧跟着触发dispatchKeyEvent

       然后触发onUserInteraction

       再次onKeyUp

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

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

(同理 dispatchKeyEvent)

onUserInteraction :Called whenever a key, touch, or trackball event is dispatched to the

    * activity.

       2.activity里有一个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

       那么最终事件序列:

11-23 17:19:44.313: INFO/activity(803): dispatchTouchEvent

11-23 17:19:44.313: INFO/activity(803): onUserInteraction

11-23 17:19:44.322: INFO/LinearLayout(803): dispatchTouchEvent

11-23 17:19:44.333: INFO/LinearLayout(803): onInterceptTouchEvent

11-23 17:19:44.341: INFO/button(803): onTouch

11-23 17:19:44.441: INFO/activity(803): dispatchTouchEvent

11-23 17:19:44.451: INFO/LinearLayout(803): dispatchTouchEvent

11-23 17:19:44.451: INFO/LinearLayout(803): onInterceptTouchEvent

11-23 17:19:44.461: INFO/button(803): onTouch

       即事件不会再向上传递,估计是ONCLICK有默认响应不处理,而ONCLICK不会有返回值

       但是如果是继承了一个VIEW而且又覆写了onTouchEvent,他返回FALSE

       当触摸事件发生时

11-23 17:25:59.691: INFO/activity(831): dispatchTouchEvent

11-23 17:25:59.691: INFO/activity(831): onUserInteraction

11-23 17:25:59.701: INFO/LinearLayout(831): dispatchTouchEvent

11-23 17:25:59.701: INFO/LinearLayout(831): onInterceptTouchEvent

11-23 17:25:59.701: INFO/button(831): onTouch

11-23 17:25:59.701: INFO/Button(831): onTouchEvent

11-23 17:25:59.701: INFO/LinearLayout(831): onTouchEvent

11-23 17:25:59.701: INFO/activity(831): onTouchEvent

11-23 17:25:59.822: INFO/activity(831): dispatchTouchEvent

11-23 17:25:59.822: INFO/activity(831): onTouchEvent

       奇怪的是,ONCLICK事件不再发生。

       VIEW和ACTIVITY本身都有相应键盘事件的ONKEYUP和ONKEYDOWN

       对于VIEW来说,你可以setOnKeyListener(new OnKeyListener(){

           @Override

           public boolean onKey(

       来响应键盘事件,如果你既对VIEW写了这个侦听,又覆写了ONKEYUP,DOWN事件,那么首先

       进入ONKEY

       比如用反向键把焦点切换到按钮上

       事件序列:

11-23 17:23:14.392: INFO/activity(803): dispatchKeyEvent

11-23 17:23:14.404: INFO/activity(803): onUserInteraction

11-23 17:23:14.412: INFO/LinearLayout(803): dispatchKeyEvent

11-23 17:23:14.412: INFO/button(803): onKey

11-23 17:23:14.422: INFO/activity(803): onKeyUp

       当按回车时

11-23 17:35:55.692: INFO/activity(831): dispatchKeyEvent

11-23 17:35:55.713: INFO/activity(831): onUserInteraction

11-23 17:35:55.722: INFO/LinearLayout(831): dispatchKeyEvent

11-23 17:35:55.732: INFO/button(831): onKey

11-23 17:35:55.813: INFO/activity(831): dispatchKeyEvent

11-23 17:35:55.824: INFO/activity(831): onUserInteraction

11-23 17:35:55.831: INFO/LinearLayout(831): dispatchKeyEvent

11-23 17:35:55.831: INFO/button(831): onKey

11-23 17:35:55.953: INFO/button(831): onClick

       最后补充下:不需要那么复杂,如果对于控件想响应他的触摸事件,如果继承

       则覆写ONTOUCHEVENT,如果不覆写则侦听ONTOUCH

       如果覆写了ONTOUCHEVENT,则不再响应ONCLICK事件

       如果写了ONCLICK,则不要再搞ONTOUCHEVENT了

       所以ONCLICK和ONTOUCHEVENT二取一,另外如果有ONTOUCH侦听,那么此函数要先于其他函数执行

       对于ONCLICK来说,要从头走俩便ONTOUCH,一次是DOWN,一次是UP

       同样的对于ONKEY,以及ONKEYUP和DOWN

       如果既覆写了ONKEYUODOWN,又SET了侦听ONKEY,那么ONKEY要优先执行,对于一个回车按键触发时

11-24 09:55:18.601: INFO/activity(951): dispatchKeyEvent

11-24 09:55:18.611: INFO/activity(951): onUserInteraction

11-24 09:55:18.621: INFO/LinearLayout(951): dispatchKeyEvent

11-24 09:55:18.641: INFO/button(951): onKey

11-24 09:55:18.711: INFO/activity(951): dispatchKeyEvent

11-24 09:55:18.756: INFO/activity(951): onUserInteraction

11-24 09:55:18.775: INFO/LinearLayout(951): dispatchKeyEvent

11-24 09:55:18.791: INFO/button(951): onKey

11-24 09:55:18.822: INFO/button(951): onClick

android 事件处理


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

我来评分 :6.1
0

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

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

www.5lulu.com