android的事件处理方式主要有两种:(1)基于监听的事件处理、(2)基于回调的事件处理。
一、基于监听的时间处理
说到事件处理,首先我们得讲一讲事件监听的模型,其中主要涉及三个对象:
(1)EventSource:事件源,也就是事件发生的地方,主要是指各类产生事件的控件。
(2)Event:事件,也就是事件处理中要处理的对象,通常是外部动作所产生的一系列对象。
(3)EventListener:事件监听器,事件处理中对事件的处理者,事件最后会传递到监听器这里,由监听器调用相应的事件处理器来处理相应事件。
事件监听的主要事件的传递流程为:
事件->事件源->监听器;
各个对象之间的关系为:
事件源产生事件对象,事件源将事件作为事件监听器的参数传入监听器。
监听器由事件源来注册。
主要是这样的三角关系,太懒就不画图了。。。
由此可以看出,三个对象中,事件源可以简单的创建出来,任何一个界面组建都可作为事件源,事件的产生由系统来做,不需要程序员操心,那么核心其实就在事件监听器上面了。
1、基于事件监听器的事件处理方式,其核心就在于xxxlistener上面,使用事件监听器处理事件的步骤大致分为以下三步:
(1)获取到事件源,也就是通过findviewbyid或者直接调用构造函数或者通过其他方式,获取到事件源的实例对象。
(2)我们需要对相应的时间监听器在对应的事件源上进行注册。也就是调用事件源的setxxxlistener函数。
(3)在监听器的相关事件处理函数中,写上我们相应的处理逻辑。
而设置监听器的方式,又有如下几种方式:
(1)实现xxxlistener接口,在外部创建一个外部类。这样做的好处所有的类都可以引用,并且实现了业务逻辑和界面逻辑的解耦。程序维护好一些。但是缺点也是无法引用相应界面类中的成员变量。
(2)使用匿名内部类。个人比较推荐这种方式。如果是复用不是很多的操作,可以直接使用匿名内部类实现相应接口。
(3)activity本身实现相应事件处理接口,将activity本身作为监听器注册进事件源。
(4)直接在布局文件中写想应处理函数的名称。再在activity中实现该函数。
二、基于回调的事件处理
基于回调的事件处理,相对于基于监听的事件处理来说要简单很多。
在回调处理的模型中,事件监听器已经完全不存在了。也就是说事件源在接收到事件之后,自主调用自己的相应的事件处理函数来处理,不要调用监听器来处理了,相对于基于监听的,事件回调方式无法动态的添加处理逻辑。也就是说,如果我们要使用基于回调的事件处理方式,我们必须继承重写事件源相应的事件处理函数,来达到处理我们自己逻辑的目的。
在android的gui组件中,所有的控件都继承自view类,而view类中为我们定义好了相关的回调方法,使用时,我们只需继承相关view类,重写相关的方法,即可处理事件,函数的调用时间,不用程序员关心:
(1)onkeydown函数:用户按下按键时触发。
(2)onkeyLongPress:用户长按某个键时触发。
(3)onKeyShortcut :用户 按下某个快捷键时触发。
(4)onKeyup:用户松开按键时触发。
(5)onTouchEvent:这个比较重要,用户触摸控件时触发。
(6)onTrackballEvent:组建上发生轨迹球屏事件时触发。
注:在使用回调方法时,例如重写了button的onkeydown事件,则我们需要在焦点处在这个button上时按下键盘,才能调用button的onkeydown函数,也就是说,默认情况下,事件发生时,获得焦点的那个控件才能调用相关的事件处理函数来处理事件。
关于android事件处理的基础整理,基本上到这里就差不多了。下一篇我们将继续深入事件处理,整理一下回调方式中,事件传递的机制。