Android 事件处理详解(二) —— 基于回调的事件处理
来源:互联网 发布:我的世界pe联机枪械js 编辑:程序博客网 时间:2024/05/22 07:49
前面博主已经介绍了事件处理中的监听机制,现在开始,我们来看看基于回调的事件处理吧。
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 事件处理详解(一) —— 基于监听的事件处理 1
- Android 事件处理详解(一) —— 基于监听的事件处理 2
- 【Android事件的处理】---基于回调的事件处理
- Android事件处理之二 基于回调的事件处理
- Android基于回调的事件处理
- Android基于回调的事件处理
- Android基于回调的事件处理
- Android事件处理模型一(基于回调机制的事件处理)
- Android 之事件处理(一)基于回调机制的事件处理
- Event---Android事件处理模型一(基于回调机制的事件处理)
- Android事件处理模型二(基于监听接口的事件处理)
- Android 之事件处理(二)基于监听的事件处理
- Android 事件处理模型(二) 基于监听接口的事件处理
- 第二课:Android的事件处理(基于回调)
- 【Android】基于监听的事件处理和基于回调的事件处理
- Android基于回调的事件处理与基于监听的事件处理
- Andorid事件处理 基于回调的事件处理
- 冒泡排序
- 运用CSS实现float:center 居中浮动li
- android模拟器
- Float 水平居中浮动
- 黑马程序员——c语言基础之数组
- Android 事件处理详解(二) —— 基于回调的事件处理
- Unity 获得Log
- POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法
- java学习_多线程1
- 自定义UIActionSheet
- JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
- _范例讲解:一对多关系
- 字符串连接效率探究
- 黑马程序员——c语言基础之指针