android提供了强大的事件处理机制,包括两套事件处理机制:
对于基于监听的事件处理而言,主要做法就是为android界面组件绑定特定的事件监听器。此外,android还允许在界面布局文件中使用android:onClick属性指定事件监听方法,通过这种方式指定事件监听方法时,开发者需要在Activity中定义事件监听方法(该方法必须有一个View类型的参数,代表被单击的UI组件),当用户单击该UI组件时,系统将会激发android:onClick属性所指定的方法。
对于基于回调的事件处理而言,主要做法就是重写android组件特定的回调方法,或者重写Activity的回调方法。一般来说,基于回调的事件处理方法的代码会显得比较简洁,可用于处理一些具有通用性地事件。
在事件处理的监听模型中,主要涉及如下三类对象:
而对于基于回调的事件事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己的特定方法将会负责处理该组件。
几乎所有的基于回调的事件处理方法都有一个boolean类型的返回值,该返回值若为true,表明该处理方法已完全处理该事件,该事件不会传播出去;若返回值为false,表明该处理方法未完全处理该事件,该事件会传播出去。
注意:android系统最先触发的是该按键上绑定的事件监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件所在的Activity。
可以看出,基于监听的事件处理模型具有更大的优势:
但是在某些情况下,基于回调的事件处理机制会更好地提高程序的内聚性。以之前的跟随手指移动的小球为例,这种形式更好地提高程序的内聚性。在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.}