Android(安卓)事件处理详解(二) —— 基于回调的事件处理
前面博主已经介绍了事件处理中的监听机制,现在开始,我们来看看基于回调的事件处理吧。
1.回调机制概述:
对于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发送特定事件之后,该事件交给事件监听器负责处理;
而对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件之后,该事件还是由事件源本身负责处理的。
1)对比Android提供的这两种事件处理模型,会发现基于监听的事件处理模型更具优势:
基于监听的事件模型分工更明确,事件源、事件监听的两个类分开实现,隐刺具有更好的可维护性。
Android的事件处理机制保证基于监听的事件监听器会被优先触发。
2)为了实现回调机制的事件处理,Android为所有GUI组件提供了一些事件处理的回调方法,以View为例:
View:
boolean onKeyDown(int keyCode,KenyEvent enent):当用户在该组件上按下某个键时触发的方法。
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):当用户在该组件上触发轨迹球屏事件时触发该方法。
2.基于回调的事件传播:
(1)概述:
1)几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:
如果处理事件的回调方法返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。如果事件处理的回调方法返回false,表明该处理方法并未完全处理事件,该事件会传播出去。
2)对于基于回调的事件传播而言,某组件上所发生的事情不仅激发该组件上的回调方法,也会触发该组件所在Activity的回调用法【前提是只要事件能传播到该Activity】
3)要使用回调事件,则要自定义组件,重写其回调方法。
(2)范例:
功能:重写Button中的onKey()方法,也重写Button所在的Activity的onKey()方法,然后通过返回true或false来判断是否阻止事件的传播。
自定义的Button:
public class MyButton extends Button { public MyButton(Context context) { super(context); } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } public MyButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) {//重写回调方法 super.onKeyDown(keyCode, event); Log.d("back","button中的回调方法"); return false;//不处理 }}
主Activity代码:
public class MainActivity extends Activity { private MyButton mButtonto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButtonto= (MyButton) findViewById(R.id.buttonto); //设置button的监听事件 mButtonto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("back","Activity的监听"); } }); } //重写Activity的回调 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); Log.d("back","Activity的回调"); return false; }}
效果解析:
我们可以看到,例子中重写了两个回调方法,且绑定一个事件监听。
当Button和Activity的回调都返回false:所以监听处理。
当Button的回调返回true,Activity回调返回false(不处理):仍然是监听来处理。【所以事件监听是先处理的】
注:监听中也是可以返回false不处理的。
从上不难看出,当某组件上发生某个按键被按下的事件时,Android系统最先触发的应该时改按键上绑定的事件监听器,接着才触发该组件提供的事件回调方法,然后还会传播到该组件中所在的Activity。
3.重写onTouchEvent方法相应触摸屏事件:
可以自定义view组件,重写其onTouchEvent方法()方法,这里就不再详述啦吧。
更多相关文章
- 源码的完全解析:Android的消息机制
- Android中的事件处理研究
- AsyncTask原理及不足
- 自定义View之滑动事件
- Android(安卓)NDK——必知必会之JNI和NDK基础全面详解(二)
- Android(安卓)本地文件缓存各个方法获取的路径小结
- Android近期任务列表Recent List(Recents Screen)的实现方式
- (三)android升级--系统升级方法和启动模式
- Android(安卓)开发 voip/sip 程序