`

Android事件处理[转发]

 
阅读更多

但是对于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实现短信转发功能

    这个Demo展示了如何在Android系统中监听短信接收事件,并自动将接收到的短信转发到预设的目标号码。以下是对实现这一功能所需技术点的详细解释: 1. **Android权限管理**: 在AndroidManifest.xml文件中,需要声明...

    FwdPortForwardingApp:适用于Android的端口转发应用 开发技术.zip

    端口转发的核心在于网络编程,Android系统提供了Socket和ServerSocket类来处理网络通信。在FwdPortForwardingApp中,开发者可能使用了ServerSocket监听本地端口,当有连接请求时,通过Socket创建一个新的连接到目标...

    Android事件分发机制总结Demo

    在ViewGroup和View中,这个方法用于接收并转发事件。当dispatchTouchEvent()返回true时,表示当前View处理了事件;返回false,则事件会继续传递给下一个View。 3. **onTouchEvent()**:这是View处理触摸事件的接口...

    基于Android的短信转发系统.zip

    本项目是一个基于Android平台的短信转发系统,主要功能是通过监听手机短信事件,将接收到的短信内容通过Gotify服务进行转发。系统利用Android的BroadcastReceiver机制监听短信事件,并通过OkHttp库发送HTTP请求实现...

    2.13-14 处理复杂的触摸事件,转发触摸事件

    在iOS和Android等移动开发平台中,处理触摸事件是构建用户界面的重要部分。开发者经常遇到的问题是如何精确地处理用户在小尺寸视图上的触摸操作,尤其是当这些视图需要复杂交互时。本主题将深入探讨如何处理复杂的...

    android 录音、编码、服务器转发、解码、播放

    在Android平台上,录音、编码、服务器转发、解码和播放是移动应用开发中常见的功能,尤其是在涉及音频处理和通信的应用中。以下是对这些关键知识点的详细说明: **录音(Recording)** Android提供了MediaRecorder...

    Android高级应用源码-后台转发短信到指定邮件箱,有一个测试界面,是别人的程序我组合一起,部分原创.zip

    该压缩包文件“Android高级应用源码-后台转发短信到指定邮件箱,有一个测试界面,是别人的程序我组合一起,部分原创.zip”提供了一个独特的Android应用程序示例,它结合了短信处理和电子邮件通信功能。这个项目的...

    Android-openup-通过upnp打开端口转发的工具类

    - 错误处理:在使用`Android-openup`时,必须处理可能出现的异常,如网络未连接、UPnP设备未找到或端口映射失败等。 - 安全性:端口转发可能带来安全风险,如暴露私有服务给外部网络,因此要谨慎使用。 通过以上...

    Android-一个非常简单的Android短信转发APP

    在Android平台上,开发一个短信转发应用是一个常见的任务,它可以帮助用户自动将接收到的短信转发到指定的号码。本文将详细解析如何构建这样一个简单的Android短信转发APP,主要涉及以下几个核心知识点: 1. **注册...

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

    当用户在屏幕上触碰或按下硬件键时,这些事件首先被硬件驱动捕捉到,然后由InputDispatcher组件转发到InputManagerService。InputManagerService对事件进行预处理,例如,它可以处理全局导航键,或者根据当前激活的...

    android利用servlet服务端转发数据实现内网两个android设备通信

    在本场景中,Android设备A和B作为客户端,通过HTTP或HTTPS协议向服务器发送请求,服务器接收到请求后处理并转发数据到另一台设备,从而实现两台设备间的数据交换。 实现步骤如下: 1. **创建Servlet**:在服务器端...

    Android 9.0 10.0 framework添加KeyEvent按键事件流程.rar

    在Android系统中,KeyEvent是处理用户输入硬件按键事件的关键类,它封装了按键按下和释放的动作。本资料主要探讨在Android 9.0 (Pie) 和 Android 10.0 (Q) 操作系统版本中,在framework层添加KeyEvent事件的详细流程...

    安卓Android源码——ipcamera-for-android 手机变成IP Camera.zip

    通过学习和分析这个源码项目,开发者不仅可以掌握如何将Android手机转变为IP Camera,还可以深入了解Android平台上的多媒体处理、网络通信和硬件访问等核心技能。这对于那些希望从事Android应用开发,尤其是涉及...

    仿AssistiveTouch,修改转发android

    5. **事件转发**: “修改转发”可能涉及到事件处理机制。当用户点击浮动按钮时,可能需要将这些事件转发到系统层,执行相应的操作,比如调用Home键、返回键、截屏等。这需要理解Android的事件传递机制,可能需要使用...

    Android-SMS302短信或者来电转发到Email

    【Android-SMS302短信或者来电转发到Email】是一个Android应用程序开发项目,其核心功能是将接收到的短信或电话记录自动转发到指定的电子邮件地址。这个项目对于那些需要实时监控或存档手机通信记录的用户非常有用,...

    Android onKeyDown监听返回键无效的解决办法

    如果在Fragment中需要处理返回键,应该在Fragment的onKeyDown()中实现,或者通过宿主Activity转发事件。 为了提高代码的可维护性和复用性,可以考虑创建一个基类Activity,里面封装好对返回键事件的处理逻辑,并让...

    Android-转发所有短信到钉钉机器人或者邮箱

    // 检查响应码,处理转发结果... } ``` 对于邮件转发,我们可以使用JavaMail API。首先,需要在项目中添加对应的依赖库,然后创建一个Session对象,配置邮件服务器信息,再构建MimeMessage对象,设置发件人、收件...

    android IP 和端口 重定向

    文件"CynoChange"可能是实现上述逻辑的具体代码,包含了创建ServerSocket、处理连接请求、转发数据以及关闭连接的相关函数。通过阅读和理解这段代码,你可以深入学习到Android中的网络编程和IP端口重定向的实现细节...

    安卓后台邮件转发短信

    当有新的短信到达时,BroadcastReceiver会接收到ACTION_SMS_RECEIVED广播,然后在此广播接收器中处理新短信的内容,将短信数据提取并准备用于转发。 2. **权限设置**:为了能够监听短信,应用需要在AndroidManifest...

Global site tag (gtag.js) - Google Analytics