`
Jessical08
  • 浏览: 13545 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

事件处理

阅读更多

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


分享到:
评论

相关推荐

    事件及事件处理程序 事件及事件处理程序

    在计算机编程领域,事件和事件处理程序是交互式应用程序的核心组成部分,特别是在图形用户界面(GUI)和Web开发中。事件是指系统或用户触发的动作或状态改变,而事件处理程序则是响应这些事件的代码块。 首先,我们...

    Delphi 动态绑定事件处理函数过程

    在 Delphi 编程环境中,动态绑定事件处理函数是一个强大的特性,它允许程序在运行时动态地连接事件和对应的处理函数,而不是在编译时静态地确定。这为开发提供了更大的灵活性,特别是在处理不确定数量的对象或者需要...

    事件处理监听器

    在编程领域,事件处理是构建用户界面(UI)和交互式应用程序的核心部分。事件是指用户与应用程序进行交互时发生的动作,如点击按钮、移动鼠标、输入文本等。这些动作会触发程序中的特定行为,通常通过事件监听器来...

    Qt事件处理之鼠标处理事件

    在Qt编程中,事件处理是构建用户界面的关键部分。它允许程序响应用户的各种操作,如鼠标点击、键盘输入等。本文将重点介绍Qt中的鼠标事件处理,并简要提及其他类型的事件处理,如键盘事件、绘图事件和定时事件。 ...

    java 事件处理教程 java窗口程序设计

    在Java的窗口程序设计中,事件处理是构建用户交互界面的关键部分。事件处理涉及当用户与界面元素(如按钮、文本框等)交互时,如何响应这些动作并执行相应的程序逻辑。这一章节主要讲解了Java的事件处理机制,特别是...

    专题资料(2021-2022年)地铁运营事故处理规则北京地铁.doc

    《北京地铁运营事故处理规则》是一份针对地铁运营事故管理和处置的重要文件,旨在确保地铁系统的安全运营。该规则遵循《中华人民共和国安全生产法》和北京市的相关法规,秉持“安全第一,预防为主”的工作方针,旨在...

    Android 事件处理机制

    Android事件处理机制

    电气设备运行及事故处理规程

    《电气设备运行及事故处理规程》是一份至关重要的专业文档,它详细规定了电气设备在运行过程中的操作规范以及在发生事故时的应急处理措施。这份资料对于电力行业的工作人员,尤其是运行维护人员来说,是日常工作中...

    JAVA事件处理指南+源码

    在Java编程中,事件处理是构建用户界面(UI)应用程序的关键组成部分。事件处理允许程序响应用户的操作,如点击按钮、选择菜单项或输入文本。本资料"JAVA事件处理指南+源码"提供了一套深入学习Java事件处理的资源,...

    工程质量事故处理记录.doc

    工程质量事故处理记录是建筑工程管理中的重要环节,它涉及到项目的安全、进度、成本和声誉。这份文档主要用于记录在施工过程中发生的各类质量问题,以便及时采取措施,防止事故扩大,并为后续的工程改进提供参考。 ...

    IOS事件处理机制 中文

    IOS 事件处理机制详解 IOS 事件处理机制是 IOS 系统中的一种机制,用于处理用户与设备的交互操作。该机制主要包括事件类型、事件触发机制、事件传递等几个方面。 事件类型 IOS 中的事件类型主要有三种:点击事件、...

    ASP.NET中的事件处理

    ### ASP.NET中的事件处理 #### 一、概述 在ASP.NET框架中,事件处理机制是其核心特性之一,它能够帮助开发者实现与用户交互的功能。本文将深入探讨ASP.NET中的事件处理机制,包括页面生命周期中的关键事件、客户端...

    道路交通事故处理PPT.pptx

    【道路交通事故处理】是交通安全教育中的重要组成部分,旨在讲解如何理解和应对道路上发生的各类事故。本PPT主要分为四个部分:交通事故概述、交通事故的分类、交通事故处理的程序以及交通事故案例。 在【交通事故...

    C#中的事件处理程序

    在C#编程语言中,事件处理程序是一种设计模式,用于在对象之间传递通知,特别是当一个对象的状态或行为发生变化时,它可以向其他对象发送事件。事件处理程序通常由委托(delegate)类型定义,该委托定义了一个方法...

    JavaGUI事件处理机制

    Java GUI事件处理机制是Java应用程序开发中的重要组成部分,主要用于响应用户在图形用户界面中的各种操作。这一机制采用了委托事件模型,使得程序结构清晰,易于扩展。下面将详细讲解这一机制的关键概念、工作流程...

    QT的事件处理机制

    ### QT的事件处理机制 #### 一、概述 在探讨QT的事件处理机制之前,我们需要先理解事件在软件开发中的重要性。事件是程序与用户的交互桥梁,它们能够捕获用户的动作并触发相应的处理逻辑。在图形用户界面(GUI)应用...

    JavaGUI事件处理

    ### JavaGUI事件处理详解 #### 一、Java GUI事件处理概览 在Java图形用户界面(GUI)编程中,事件处理是一项核心技能。通过事件处理,我们能够使GUI应用程序响应用户的操作,例如鼠标点击、键盘输入等。Java的事件...

    java事件处理机制

    Java事件处理机制是Java GUI编程中的重要组成部分,它允许用户与图形界面进行交互。在Java中,事件处理涉及事件源(Event Source)、事件(Event)和事件监听器(Event Listener)。当用户执行某个操作,如点击按钮...

    JAVA事件处理指南

    在Java编程语言中,事件处理是用户界面(UI)编程的核心部分,它使得应用程序能够响应用户的操作,如点击按钮、选择菜单项或者滚动窗口。在《JAVA事件处理指南》这本书中,作者深入浅出地讲解了Java事件处理的各个...

    论文研究-基于分布式事件分发的复杂事件处理引擎的设计与实现 .pdf

    在信息化时代,物联网(IoT)技术的快速发展带动了对大数据实时处理能力的需求,这促使了复杂事件处理(Complex Event Processing, CEP)技术的兴起。复杂事件处理是处理并分析来自不同源的实时事件流以检测其中的...

Global site tag (gtag.js) - Google Analytics