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
分享到:
相关推荐
Android事件处理机制
复杂事件处理手册 在金融服务和其他行业中,如何使那些重要且具有战略意义的业务信息以高速数据流 的方式到达企业变得尤其重要,而复杂事件处理(CEP)就是这一过程的代名词。在复杂事 件处理中,数据是不断变化的,...
事件及事件处理程序 事件及事件处理程序视频
针对物联网事件云的复杂事件处理面临的海量事件规模、分布式数据处理、上下文相关等挑战, 提出一种分布式的上下文敏感复杂事件处理方法。该方法基于模糊本体进行事件上下文的表示和推理, 通过查询重写支持事件上下文...
在每个对象上,这个事件处理函数只会被执行一次。其他规则与bind()函数相同。这个事件处理函数会接收到一个事件对象,可以通过它来阻止(浏览器)默认的行为。如果既想取消默认的行为,又想阻止事件起泡,这个事件...
IT故障事件处理报告模块,可供各位参考
1.实现JavaScript事件注册;...2.实现JavaScript事件处理函数; 3.实现JavaScript鼠标和键盘事件; 4.实现JavaScript表单相关事件; 5.实现JavaScript字幕滚动事件; 6.实现JavaScript编辑事件;
java窗口事件处理
有关电气设备运行及事故处理规程的有关资料
java事件处理机制ppt 有3种角色: 1.event object:就是事件产生时具体的“事件”,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event source:具体的接受事件的实体,比如说,你...
JAVA事件处理机制 事件监听器 事件监听器适配器
这是一个Qt事件处理系统,目前只实现了鼠标事件的处理,后续将添加键盘事件,绘图事件,定时事件等等的处理过程。程序比较简单,适合初学者。程序开发环境:win7+qt5.7.0
java事件处理机制 java事件处理机制 java事件处理机制 java事件处理机制
Delphi 动态绑定事件 指定事件处理函数过程 绑事事件自定义函数过程 测试完全可用,含源码文本.
工程质量事故处理记录 C 1.10 编号: 工程名称 施工单位 事故部位 报告日期 事故简况 预计损失 建筑: 材料设备: 人工费: 伤亡: 其他: 事故处理经过: 事故处理结果: 施工专业技术负责人...
在Android应用程序中,有一类...这个PPT讲Android应用程序输入事件的分发和处理过程,主要涉及到输入管理InputManager、输入事件监控线程InputReader、输入事件分发线程InputDispatcher,以及应用程序主线程消息循环。
事件处理编程范例
学习事件处理的好资料,主要是一些JAVA处理实例,通过实例来介绍JAVA事件处理,内附书中示例源码。
新版食堂人员职责与管理方案、投诉处理方案、消防、治安及意外事故处理方案.pdf
机动车交通事故处理流程及诉讼实务,机动车交通事故处理流程及诉讼实务课件,机动车交通事故处理流程及诉讼实务PPT