第二课:Android的事件处理(基于回调)

来源:互联网 发布:聚宝盆直播软件安卓版 编辑:程序博客网 时间:2024/05/23 13:25

对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在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);}@Overridepublic 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);}@Overridepublic 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{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Button bn = (Button) findViewById(R.id.bn);// 为bn绑定事件监听器bn.setOnKeyListener(new OnKeyListener(){@Overridepublic 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方法,该方法可监听它所包含的所有组件的按键被按下事件@Overridepublic 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);}@Overridepublic void onDraw(Canvas canvas){super.onDraw(canvas);// 设置画笔的颜色p.setColor(Color.RED);// 绘制一个小圆(作为小球)canvas.drawCircle(currentX, currentY, 15, p);}@Overridepublic boolean onTouchEvent(MotionEvent event){// 当前组件的currentX、currentY两个属性this.currentX = event.getX();this.currentY = event.getY();// 通知改组件重绘this.invalidate();// 返回true表明处理方法已经处理该事件return true;}}

源代码点击下载

0 0