但是对于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(){?
? ?? ?? ?? [email protected]
? ?? ?? ?? ?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事件处理[中转]
热度:147 发布时间:2016-05-01 18:32:46.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法