Android包括两套事件处理机制:(1)基于监听的事件处理;(2)基于回调的事件处理
1.基于监听的事件处理:
三要素:事件源(Event Source)、事件(Event)、事件监听器(Event Listener)
Android的事件处理机制是一种委派式事件处理方式:事件源把整个事件处理委托给事件监听器。当外部动作在Android组件上进行操作时,系统会自动生成事件对象,这个事件对象会作为参数传递给注册到事件源上的事件监听器。然而很多时候我们并没有在参数中看到事件的踪迹,为什么呢?因为Android对事件监听模型进行了简化,当事件源触发的事件足够简单,事件里面封装的事件信息比较有限时,那就没必要封装事件对象传给监听器。但是对于键盘事件、触摸屏事件等包含更多信息的事件,那就需要将事件封装成XxxEvent事件传给监听器。
代码实例:
planeView.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View source, int keyCode, KeyEvent event)
{
// 获取由哪个键触发的事件
switch (event.getKeyCode())
{
// 控制飞机下移
case KeyEvent.KEYCODE_DPAD_DOWN:
planeView.currentY += speed;
break;
// 控制飞机上移
case KeyEvent.KEYCODE_DPAD_UP:
planeView.currentY -= speed;
break;
// 控制飞机左移
case KeyEvent.KEYCODE_DPAD_LEFT:
planeView.currentX -= speed;
break;
// 控制飞机右移
case KeyEvent.KEYCODE_DPAD_RIGHT:
planeView.currentX += speed;
break;
}
// 通知planeView组件重绘
planeView.invalidate();
return true;
}
});
在程序中实现监听器,通常有如下几种形式:
(1)内部类形式 (2)外部类形式 (3)Activity本身作为事件监听器 (4)匿名内部类形式
2.基于回调的事件处理
基于回调的事件处理模型更加简单,事件源与事件监听器是统一的,或者说事件监听器消失了。当用户在GUI组件上激发某个事件时,组件自己的特方法将会负责处理该事件。为了实现回调机制的事件处理,Android为所有的GUI组件都提供了一些事件处理的回调方法,要通过自定义View来实现,自定义View时重写View的事件处理方法即可。
代码实例:
public class MyButton extends Button
{
public MyButton(Context context , AttributeSet set)
{
super(context , set);
// TODO Auto-generated constructor stub
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
super.onKeyDown(keyCode , event);
Log.v("-crazyit.org-" , "the onKeyDown in MyButton");
//返回true,表明该事件不会向外扩散
return true;
}
}
布局文件中如何使用该Button:
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 使用自定义View时应使用全限定类名
-->
<org.danny.event.MyButton android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="单击我" />
</LinearLayout>
这样将事件处理封装在View内部,提高了程序的内聚性,基于回调的事件处理更适合于那种事件处理逻辑比较固定的View。
3.Handler消息传递机制
Android的消息传递机制是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题。