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方法()方法,这里就不再详述啦吧。

0 0