`
ET焖猪仔
  • 浏览: 236974 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类
最新评论

Android事件处理

阅读更多
转载:http://blog.csdn.net/G_rrrr/archive/2009/11/24/4861189.aspx
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 事件处理机制

    Android事件处理机制

    Android事件处理.ppt

    Android事件处理

    android事件处理

    Android事件处理系统允许应用程序响应用户的触摸、键盘输入、网络变化等各种事件。本篇将详细解析Android事件处理机制,特别是基于给定的"android 事件处理demo",我们将深入探讨如何在实际应用中处理触摸事件。 ...

    Android事件处理机制详解及源码

    Android事件处理机制是Android应用程序开发中的关键组成部分,它使得用户与应用之间能够进行有效的交互。在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的...

    Android 事件处理机制 demo

    在Android应用开发中,事件处理机制是至关重要的组成部分,它涉及到用户与应用程序的交互,包括点击、滑动等各类操作。本示例"Android 事件处理机制 demo"将深入探讨这一主题,通过实际代码演示如何有效地管理和响应...

    Android、教程<经典> 6 Android事件处理

    长期更新的Android事件处理教程应该会涵盖以上各个知识点,并随着Android版本的更新,介绍新的API和最佳实践。例如,Android Jetpack中的`ViewBinding`简化了视图引用,`MotionEvent`提供了更精细的触摸事件处理,...

    Android键盘事件处理例子

    在Android开发中,键盘事件处理是一项重要的技能,它涉及到用户输入的交互逻辑,对提升应用的用户体验至关重要。本文将深入探讨Android键盘事件处理,并通过一个实际的案例来讲解相关知识点。 首先,Android中的...

    Android事件处理专题研究

    Android事件处理,触摸事件、监听事件、手势识别等技术颇有研究,对个人开发非常有用。请安心下载。

    android事件的处理模型和多线程的处理方法

    首先,Android事件处理主要围绕Input子系统进行,它包含了键盘、触摸屏等设备输入的管理和分发。InputManager是这一子系统的核心,它在Java层和C++层都有相应的实现。在Java层,WindowManagerService创建Input...

    android事件派发验证demo

    通过这个demo,开发者可以直观地了解Android事件处理机制,并进行实际操作以验证其工作原理。这对于优化用户界面交互和调试事件处理问题具有重要的实践意义。在实际开发中,灵活运用事件派发机制可以创建更高效、...

    android 事件处理

    在Android开发中,事件处理是构建用户交互界面的关键部分,它使得应用能够响应用户的操作,如点击按钮、滑动屏幕等。"李刚疯狂android 第三章事件处理"主要涵盖了以下几个核心知识点: 1. **基于监听的事件处理**:...

    Android 事件处理与交互式PPT

    (1)理解Android的应用组件及其功能、特点 ...(3)理解并掌握Android的事件处理机制,掌握基于监听的事件处理机制和基于回调的事件处理机制使用方法 (4)了解Android的对话框与消息框,掌握Android的Toast。

Global site tag (gtag.js) - Google Analytics