android提供了强大的事件处理机制,包括两套事件处理机制:
- 基于监听的事件处理
- 基于回调的事件处理
对于基于监听的事件处理而言,主要做法就是为android界面组件绑定特定的事件监听器。此外,android还允许在界面布局文件中使用android:onClick属性指定事件监听方法,通过这种方式指定事件监听方法时,开发者需要在Activity中定义事件监听方法(该方法必须有一个View类型的参数,代表被单击的UI组件),当用户单击该UI组件时,系统将会激发android:onClick属性所指定的方法。
对于基于回调的事件处理而言,主要做法就是重写android组件特定的回调方法,或者重写Activity的回调方法。一般来说,基于回调的事件处理方法的代码会显得比较简洁,可用于处理一些具有通用性地事件。
在事件处理的监听模型中,主要涉及如下三类对象:
- Event Source(事件源):事件发生的场所,通常就是各个组件
- Event(事件):事件封装了界面组件上发生的特定事情,一般通过Event对象来取得
- Event Listener(事件监听器):负责监听事件源所发生的事件,并做出相应的响应
而对于基于回调的事件事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己的特定方法将会负责处理该组件。
几乎所有的基于回调的事件处理方法都有一个boolean类型的返回值,该返回值若为true,表明该处理方法已完全处理该事件,该事件不会传播出去;若返回值为false,表明该处理方法未完全处理该事件,该事件会传播出去。
注意:android系统最先触发的是该按键上绑定的事件监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件所在的Activity。
可以看出,基于监听的事件处理模型具有更大的优势:
- 基于监听的事件处理模型分工更明确,事件源、事件监听由两个类分别实现,具有更好的可维护性
- android事件处理机制保证基于监听的事件监听器优先被触发
但是在某些情况下,基于回调的事件处理机制会更好地提高程序的内聚性。以之前的跟随手指移动的小球为例,这种形式更好地提高程序的内聚性。在Activity类中不需要再为该View绑定事件监听器,因为该View自己就可以处理触摸屏事件。总的来说,基于回调的事件处理更适合事件处理逻辑比较固定的View。
01.public class DrawView extends View
02.{
03. private float currentX=40;
04. private float currentY=50;
05. //定义并创建画笔
06. Paint p=new Paint();
07. public DrawView(Context context)
08. {
09. super(context);
10. }
11.
12. public DrawView(Context context,AttributeSet set)
13. {
14. super(context,set);
15. }
16.
17. @Override
18. protected void onDraw(Canvas canvas)
19. {
20. //设置画笔的颜色
21. p.setColor(Color.RED);
22. //绘制圆
23. canvas.drawCircle(currentX,currentY,15,p);
24. }
25.
26. @Override
27. public boolean onTouchEvent(MotionEvent event)
28. {
29. //获得(更新)位置坐标
30. this.currentX=event.getX();
31. this.currentY=event.getY();
32. //通知当前组件重绘
33. this.invalidate();
34. return true;
35. }
36.}