对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。
实现方法:集成GUI组件类,并重写该类的事件处理方法。
为了实现回调机制的事件处理,Android为所有GUI组件都提供了一些事件处理的回调方法,以View为例,该类包含如下方法:
boolean onKeyDown(int keyCode, KeyEvent event);当用户在该组件上按下某个按键时触发该方法。
boolean onKeyLongPress(int keyCode, KeyEvent event);当用户在该组件上长按某个按键时触发该方法。
boolean onKeyShortCut(int keyCode, KeyEvent event);当一个键盘快捷键事件发生时触发该方法。
boolean onKeyUp(int keyCode, KeyEvent event);当用户在该组件上松开某个按键时触发该方法。
boolean onTouchEvent(MotionEvent event);当用户在该组件上触发触摸屏事件时触发该方法。
boolean onTrackballEvent(MotionEvent event);当用户在该组件上触发轨迹球屏事件时触发该方法。
例1:基于回调的事件不扩散
MyButton.java
public class MyButton extends Button
{
public MyButton(Context context, AttributeSet set)
{
super(context, set);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
super.onKeyDown(keyCode, event);
Log.v("-crazyit.org-", "the onKeyDown in MyButton");
// 返回true,表明该事件不会向外扩散
return true;
}
}
例2:基于回调的事件传播
MyButton.java
public class MyButton extends Button
{
public MyButton(Context context , AttributeSet set)
{
super(context , set);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
super.onKeyDown(keyCode , event);
Log.v("-MyButton-" , "the onKeyDown in MyButton");
// 返回false,表明并未完全处理该事件,该事件依然向外扩散
return false;
}
}
Propagation.java
public class Propagation extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 为bn绑定事件监听器
bn.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View source
, int keyCode, KeyEvent event)
{
// 只处理按下键的事件
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
Log.v("-Listener-", "the onKeyDown in Listener");
}
// 返回false,表明该事件会向外传播
return true; // ①
}
});
}
// 重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
super.onKeyDown(keyCode , event);
Log.v("-Activity-" , "the onKeyDown in Activity");
//返回false,表明并未完全处理该事件,该事件依然向外扩散
return false;
}
}
例3:重写onTouchEvent方法响应触摸屏事件
DrawView.java
public class DrawView extends View
{
public float currentX = 40;
public float currentY = 50;
// 定义、创建画笔
Paint p = new Paint();
public DrawView(Context context, AttributeSet set)
{
super(context, set);
}
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
// 设置画笔的颜色
p.setColor(Color.RED);
// 绘制一个小圆(作为小球)
canvas.drawCircle(currentX, currentY, 15, p);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
// 当前组件的currentX、currentY两个属性
this.currentX = event.getX();
this.currentY = event.getY();
// 通知改组件重绘
this.invalidate();
// 返回true表明处理方法已经处理该事件
return true;
}
}
源代码点击下载