Android事件分发机制

来源:互联网 发布:智慧农业大数据平台 编辑:程序博客网 时间:2024/06/07 03:51

阅读郭林的文章后,记录一下自己学到的知识
当触摸一个View的时候,会调用dispatchTouchEvent方法,该方法中最重要的代码如下

if (li != null && li.mOnTouchListener != null       && (mViewFlags & ENABLED_MASK) == ENABLED       && li.mOnTouchListener.onTouch(this, event)) {    result = true;}if (!result && onTouchEvent(event)) {    result = true;}

通过例子来说明该方法的执行流程:

button.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View v, MotionEvent event) {       Log.e("Button", "onTouch execute, action " + event.getAction());       return false;    }});button.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View view) {        Log.e("Button", "onClick execute");    }});

分别给Button设置OnTouchListener和OnClickListener事件,当点击Button时,输出日志如下:

Button: onTouch execute, action 0Button: onTouch execute, action 1Button: onClick execute

由此可见,它首先执行onTouch方法,再执行onClick方法。分析dispatchTouchEvent方法,确实如此。但是注意,当将onTouch方法中返回true时,就不再执行onClick方法,表明该事件已经被消费掉,不再往下传递。

0 0