android学习笔记之事件处理机制

    android提供了强大的事件处理机制,包括两套事件处理机制:

  1. 基于监听的事件处理
  2. 基于回调的事件处理

       对于基于监听的事件处理而言,主要做法就是为android界面组件绑定特定的事件监听器。此外,android还允许在界面布局文件中使用android:onClick属性指定事件监听方法,通过这种方式指定事件监听方法时,开发者需要在Activity中定义事件监听方法(该方法必须有一个View类型的参数,代表被单击的UI组件),当用户单击该UI组件时,系统将会激发android:onClick属性所指定的方法。

       对于基于回调的事件处理而言,主要做法就是重写android组件特定的回调方法,或者重写Activity的回调方法。一般来说,基于回调的事件处理方法的代码会显得比较简洁,可用于处理一些具有通用性地事件。

    在事件处理的监听模型中,主要涉及如下三类对象:

  1. Event Source(事件源):事件发生的场所,通常就是各个组件
  2. Event(事件):事件封装了界面组件上发生的特定事情,一般通过Event对象来取得
  3. Event Listener(事件监听器):负责监听事件源所发生的事件,并做出相应的响应

       而对于基于回调的事件事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己的特定方法将会负责处理该组件。

       几乎所有的基于回调的事件处理方法都有一个boolean类型的返回值,该返回值若为true,表明该处理方法已完全处理该事件,该事件不会传播出去;若返回值为false,表明该处理方法未完全处理该事件,该事件会传播出去。

       注意:android系统最先触发的是该按键上绑定的事件监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件所在的Activity。

     可以看出,基于监听的事件处理模型具有更大的优势:

  1. 基于监听的事件处理模型分工更明确,事件源、事件监听由两个类分别实现,具有更好的可维护性
  2. 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.}  


 

 

你可能感兴趣的:(Android学习)