`

Android键盘和触摸事件处理

阅读更多
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


原文鏈接:http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344870.html

onTouchEvent的参数详解
event.getAction() //获取触控动作比如ACTION_DOWN  
event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕  
event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引  
event.getX(nID); //获取第nID个触控点的x位置      
event.getY(nID); //获取第nID个点触控的y位置  
event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的  
event.getDownTime() //按下开始时间  
event.getEventTime() // 事件结束时间  
event.getEventTime()-event.getDownTime()); //总共按下时花费时间 
分享到:
评论

相关推荐

    Android键盘事件处理例子

    首先,Android中的键盘事件主要分为两种:软键盘(Software Keyboard)事件和硬件键盘(Hardware Keyboard)事件。软键盘通常在触摸屏设备上显示,而硬件键盘则是指物理键盘,如连接到Android设备的蓝牙键盘。 1. ...

    Android应用程序输入事件处理机制

    在Android应用程序中,有一类...这个PPT讲Android应用程序输入事件的分发和处理过程,主要涉及到输入管理InputManager、输入事件监控线程InputReader、输入事件分发线程InputDispatcher,以及应用程序主线程消息循环。

    android详细解释键盘和鼠标事件.pdf

    Android 键盘和鼠标事件详解 Android 事件机制是现代用户界面的核心组件之一,它基于事件驱动的方式来实现人机交互。...通过对触摸屏事件和按键事件的处理,可以实现复杂的用户交互逻辑,提高应用程序的用户体验。

    android键盘

    一个KeyboardView,用于渲染键盘并处理触摸事件。 2. XML布局:在布局文件中添加`KeyboardView`,并指定对应的`Keyboard`资源ID。 3. Activity代码:初始化`KeyboardView`,设置`OnKeyboardActionListener`,并根据...

    Android键盘

    优化键盘性能包括减少布局复杂性,避免过度绘制,以及合理处理触摸事件。同时,考虑不同屏幕尺寸和方向的适配,确保键盘在各种设备上都能良好工作。 总结,Android键盘的自定义能力为开发者提供了丰富的可能性,...

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

    在Android开发中,处理键盘事件是一项重要的任务,特别是在设计用户交互界面时。本文将深入探讨如何处理物理按键事件,特别是如何屏蔽系统自带的后退键。Android设备通常配备多个物理按键,包括返回键,这对于应用的...

    Android 软键盘和emoji表情切换方案,和微信几乎一样的体验

    - 使用KeyboardView对象,它负责绘制并处理键盘的触摸事件,可以通过更换键盘布局实现不同模式的切换。 3. **处理emoji表情** - 收集和整理常用的emoji表情,可以使用Unicode编码或自定义的图片资源。 - 当用户...

    Android推箱子说明支持键盘和触摸屏操作.rar

    - 对于触摸屏操作,Android提供了GestureDetector和MotionEvent类来捕获和处理用户的触摸事件,实现滑动、点击等交互。 - 支持键盘操作,需要监听硬件键盘或软键盘的按键事件。Android中的`KeyEvent`类用于处理...

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

    在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的用户体验和功能实现。下面我们将深入探讨Android事件处理机制的原理及其源码分析。 首先,Android事件处理...

    android 纯自定义数字键盘输入

    总之,"android 纯自定义数字键盘输入"项目是一个实用的学习资源,它涵盖了Android自定义View的开发、触摸事件处理、界面布局设计等多个知识点。通过研究这个`KeyDemo`,开发者不仅可以学会如何创建自定义键盘,还能...

    [Hasen图示系列]android中键盘消息处理机制

    象以及负责处理触摸屏事件的 TouchInputMapper 对象等 KeyboardInputMap per::processKey 这个函数首先对对按 键作一些处理,例如 需要根据当时屏幕的 方向来调整键盘码 InputDispatcher::notify Key( 继承自 ...

    android事件处理

    本篇将详细解析Android事件处理机制,特别是基于给定的"android 事件处理demo",我们将深入探讨如何在实际应用中处理触摸事件。 首先,Android事件处理主要分为两个阶段:事件分发(Dispatching)和事件处理...

    android自定义键盘数字键与英文键盘切换

    这可以通过监听触摸事件并在必要时调用`InputMethodManager`的`hideSoftInputFromWindow()`方法实现。 以上就是创建一个支持数字键与英文键盘切换的自定义键盘的基本步骤。在实际开发中,你可能还需要考虑更多细节...

    基于Android平台的事件处理

    Android提供了丰富的事件处理机制,包括但不限于触摸事件、键盘事件、菜单事件等。这些事件可以通过监听器的方式进行捕获和处理。例如,触摸事件可以使用`OnTouchListener`接口来监听,而键盘事件则可以使用`...

    Android usb 触摸屏驱动

    3. **User Space驱动**:在用户空间,驱动程序通过Android Input框架与系统交互,将内核空间的数据解析为触摸事件,并发送到应用程序。 在Linux环境下,USB触摸屏驱动的实现也遵循类似的架构,但由于Linux内核对USB...

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

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

    android软键盘上移动焦点

    首先,焦点移动的关键在于监听和处理键盘事件。为了实现在软键盘上移动焦点,需要重写`onKeyDown(int keyCode, KeyEvent event)`方法。这个方法允许我们拦截并处理按键事件,其中`keyCode`参数对应于`KeyEvent`中的...

    Delphi XE 开发Android虚拟键盘

    Delphi XE 开发Android虚拟键盘 ,源码文件:FMX.VirtualKeyboard.Android

    android中的事件处理

    3. 对于复杂的触摸事件,可以结合GestureDetector和ScaleGestureDetector等工具类进行处理。 总结,Android中的事件处理是构建用户友好界面的关键,理解和熟练掌握事件处理机制能够帮助开发者构建更流畅、更具交互...

    android自定义全键盘随机(包含字母+标点符号+数字)

    2. **触摸事件处理**:每个按键应能响应用户的触摸事件。这需要在Java代码中添加点击事件监听器,当用户点击按键时,触发相应的输入动作。 3. **字符映射**:每个按键对应一个或多个字符,包括大小写字母、数字和...

Global site tag (gtag.js) - Google Analytics