`

android事件3-在按键触摸之前调用的方法

阅读更多

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/G_rrrr/archive/2009/11/24/4861189.aspx

本文紧接android事件2,放开2实例相关注释即可

在按键触摸之前调用的方法dispatchTouchEvent,onUserInteraction

 

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

SDK中文事件处理:http://blog.csdn.net/iefreer/archive/2009/09/23/4586351.aspx

 

分享到:
评论

相关推荐

    Android键盘事件处理例子

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

    android实现按键精灵

    在Android平台上,"按键精灵"是一种自动化工具,它允许用户录制一系列操作,如触摸屏点击、滑动等,然后重复播放这些操作,实现自动化任务执行。这个“android实现按键精灵”的简单DEMO程序旨在揭示其核心原理,让...

    android 通过AccessibilityService实现系统按键监听

    在Android开发中, AccessibilityService 是一个非常重要的服务接口,它允许应用在用户与系统交互时获取到相关的事件,比如点击、触摸屏幕或者按下系统按键。这个功能被广泛应用于辅助功能应用,例如为视力障碍者...

    android处理键盘事件之物理按键(屏蔽后退键)

    总结来说,Android开发者可以通过重写`onKeyDown`、`onKeyUp`和`onBackPressed`方法来处理物理按键事件,特别是屏蔽后退键。不过在屏蔽系统功能前,务必考虑用户体验,确保你的应用仍然保持易用性。同时,提供的文档...

    Android-通过简单的代码控制手机的屏幕和物理按键

    在Android平台上,开发者可以通过特定的API来实现对设备硬件的控制,包括屏幕和物理按键的模拟操作。这个项目"ClickOnTheSimulation"很可能是提供了一种方式,让我们可以通过编程来控制手机的屏幕亮暗以及模拟按下...

    Android应用源码之按键的处理.zip

    在Android应用开发中,理解和处理按键事件是至关重要的,因为这直接影响到用户的交互体验。本资料包"Android应用源码之按键的处理.zip"显然聚焦于解析如何在Android应用程序中捕获并响应用户输入的按键操作。下面...

    安卓按键模拟点击相关-android注入代码到驱动模拟系统点击事件demo.rar

    在Android中,这种机制主要由`View`类及其子类实现,它们通过`onTouchEvent()`方法捕获并处理触摸事件。 2. **注入代码** 注入代码是指在运行时动态修改或增强原有代码的功能,这通常需要对Android的系统服务有...

    Android-input-system-analysis.rar_Android input system_android

    在Android操作系统中,输入系统(Input System)是一个至关重要的组件,它负责处理各种用户交互,如触摸屏操作、物理按键事件、手势等。本资源"Android-input-system-analysis.rar"提供了对Android输入系统的深入...

    android应用上报按键源码

    3. **上报按键消息**:题目提到的“上报按键消息”,在Android中通常意味着监听并记录按键事件。这可以通过在`Activity`或自定义`View`中捕获按键事件并进行处理来实现。例如,你可以创建一个全局变量来存储按键信息...

    Android事件注入Demo

    3. **事件构造**:在注入事件之前,需要构造出对应的事件对象。例如,对于MotionEvent,你需要设置ACTION_DOWN和ACTION_UP来模拟一次点击,对于KeyEvent,设置不同的键码和状态来模拟按键按下和释放。 4. **事件...

    Android 处理按键的响应方式

    这个方法会在任何其他按键处理方法之前被调用,你可以在这里决定事件是否应该被处理,或者如何处理。 6. **Focus 和 Touch Mode** 当一个 `View` 获得焦点时,它会接收按键事件。在触摸屏设备上,通常只有在触控...

    Android代码-用户界面之重写onKeyDown方法源码.zip

    在Android开发中,用户界面(UI)的交互是至关重要的,而`onKeyDown`方法是处理用户硬件按键事件的关键部分。这个压缩包包含了关于如何在Android应用中重写`onKeyDown`方法的源码示例,这对于理解Android事件处理...

    Android 事件分发机制视频讲解

    Android中的事件主要包括触摸事件和按键事件等,这些事件的分发遵循一定的层次结构。当一个事件发生时,如触摸屏幕或按下某个键,该事件首先会被传递给WindowManagerService(窗口管理服务),然后由...

    Android-基于UiAutomator框架自动模拟用户手势操作类似于触摸精灵按键精灵

    这个框架允许我们编写测试脚本来模拟用户的手势操作,实现对应用程序UI元素的精确控制,类似于触摸精灵或按键精灵。本文将深入探讨基于UiAutomator的自动模拟用户手势操作。 首先,我们需要理解什么是UiAutomator。...

    android添加外部按键

    Android系统通过消息队列(MessageQueue)和Handler来处理事件,包括触摸事件、按键事件等。对于外部按键,我们主要关注的是`KeyEvent`对象,它封装了按键的相关信息,如按键码(key code)、事件类型(ACTION_DOWN,...

    Android 事件驱动流程

    在Android系统中,事件驱动流程是其用户界面交互的核心机制,特别是对于输入事件的处理,如触摸屏操作、按键点击等。Android输入事件处理流程主要涉及Boot过程、系统服务启动、窗口管理服务(WindowManagerService)...

    Android之Input子系统事件分发流程 - CSDN博客1

    在步骤3,`mWindowSession.addToDisplay()` 被调用,这个方法会将新视图添加到显示列表,并且将之前创建的InputChannel与服务端建立连接。`mWindowSession` 是一个IWindowSession接口的实现,它是由`...

    android按钮添加按键音操作

    在Android中,用户与界面交互通常涉及到两种类型的事件:触摸事件(TouchEvent)和按键事件(KeyEvent)。对于按钮,通常我们关注的是点击事件(OnClickListener),而不是物理键盘的按键事件。因此,添加按键音主要...

    Android 用户界面之重写onKeyDown方法源码-IT计算机-毕业设计.zip

    在实际应用开发中,通常还需要结合`onKeyUp`方法来处理按键抬起事件,以确保完整的一次按键操作能够得到正确的响应。同时,对于复杂的按键组合,可能需要利用`KeyEvent`的其他属性,如`getMetaState()`来判断是否有...

    安卓键盘输入相关-一个Android九宫格实体按键输入法支持中文但不能联想输入.rar

    在Android中,处理实体按键的输入通常涉及到对KeyEvent事件的处理。开发者需要在InputMethodService的onKeyDown()或onKeyUp()方法中,根据KeyEvent的动作(ACTION_DOWN或ACTION_UP)和键码(KeyEvent.KEYCODE_XXX)...

Global site tag (gtag.js) - Google Analytics