`

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

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

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

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

    本例子讲述了,android开发中常用的键盘事件的处理示例。另外,加有文档的说明

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

    Android推箱子说明支持键盘和触摸屏操作.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Delphi XE 开发Android虚拟键盘

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

    Android应用程序消息处理机制

    Android应用程序主线程是一个特殊的线程,因为它同时也是UI线程以及触摸屏、键盘等输入事件处理线程。主线程对消息循环很敏感,一旦发生阻塞,就会影响UI的流畅度,甚至发生ANR问题。这个PPT讲Android应用程序线程...

    android获取手指触摸位置的方法

    该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。 其原型是: public boolean onTouchEvent(MotionEvent event) 参数event:参数event为手机屏幕触摸...

    Android代码-一行代码实现软键盘与EditText的交互

    > 原理 : 怎样封装成一行代码实现,就是重写Activity的dispatchTouchEvent(MotionEvent ev)方法,全局监听触摸事件, 当点击的页面时,发现如果焦点在EditView上,就把软键盘隐藏,否则就不做处理. >使用: 只要对应的页面 ...

    android 软键盘隐藏

    Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用...

    手机模拟触摸板(PC+android)

    里面包含手机模拟触摸板的PC端和手机端,分别安装在电脑和手机上之后,把电脑和手机连在同一个无线网络内,就可以实现用手机控制电脑的功能,也可以通过蓝牙是电脑与手机将连接。

    Android开发案例驱动教程 配套代码

    4.4.1 触摸事件 53 4.4.2 键盘事件 55 4.5 菜单 57 4.5.1 文本菜单 57 4.5.2 图片文本菜单 59 本章小结 60 第5章 UI基础控件 61 5.1 按钮 61 5.1.1 Button 62 5.1.2 ImageButton 63 5.1.3 ToggleButton 64...

    qt4.8软键盘(通过点击输入框呼出).zip

    此资源为qt4.8软键盘代码(只完成了一个lineedit的功能),该软键盘类似于安卓系统键盘可点击输入框弹出软键盘

    android命令行模拟输入事件(文字、按键、触摸等)

    主要给大家介绍了关于android命令行模拟输入事件,例如文字、按键、触摸等的相关资料,文中通过示例代码介绍的非常详细,对各位android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    基于单片机的简易触摸屏手机设计

    特别是 android 操作系统和触摸屏的便捷性,使触摸屏手机迅速普及,触摸屏手机 将是未来手机的主流配置,此系统就是研究触摸屏手机的工作原理及实现方法。整 个系统主要是由 STC12C5A60S2 单片机,SIM300 模块,串口...

    android开发秘籍

    5.1.5 秘诀45:响应触摸事件 107 5.1.6 秘诀46:监听滑动手势 109 5.1.7 秘诀47:使用多点触控 110 5.2 高级用户界面库 113 5.2.1 秘诀48:使用手势 114 5.2.2 秘诀49:绘制3d 图像 117 第6 章 多媒体技术 122 6.1...

    10大经典Android开源项目分享(学习android必备)

     RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。  3、 TorProxy和Shadow  TorProxy应用实现了...

    Android中点击隐藏软键盘最佳方法

    本文介绍了Android中点击隐藏软键盘最佳方法。具有很好的参考价值,下面跟着小编一起来看下吧

    android 10个开源项目的学习

     RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。  3、 TorProxy和Shadow  TorProxy应用实现了...

    Android触摸及手势操作GestureDetector

    当用户触摸屏幕时会产生很多的触摸事件,down、up、move等等。View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,如下: public class ...

Global site tag (gtag.js) - Google Analytics