事件分发

来源:互联网 发布:如何注册淘宝企业商铺 编辑:程序博客网 时间:2024/05/29 07:31

事件分发
1、控件事件
onTouch(setOnTouchListener)优先于onClick(setOnClickListener)执行。
onTouch方法中有boolean型返回值,返回false后onClick不执行。
当你触碰到任何一个控件都会调用该控件的dispatchTouchEvent方法,
public boolean dispatchTouchEvent(MotionEvent event) {  
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&  
mOnTouchListener.onTouch(this, event)) {  
return true; 
}
return onTouchEvent(event);  
}
当设置了setOnTouchListener,mOnTouchListener就不为空
(mViewFlags & ENABLED_MASK) == ENABLED判断当前点击控件是否enable,按钮默认enable
mOnTouchListener.onTouch(this, event)就是setOnTouchListener的返回值返回
如果三个都是true就返回true如果有false就执行onTouchEvent
在onTouchEvent中判断如果控件是可点击的就会进入MotionEvent.ACTION_UP中,
经过种种判断会进入performClick()方法
public boolean performClick() {
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
if (mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
mOnClickListener.onClick(this);
return true;
}
return false;
}
如果这里mOnClickListener(setClickListener设置)不是空就回调onClick
在dispatchTouchEvent中,如果一个事件返回false下一个事件就不会执行。
那么在onTouch中返回了false为什么后续事件还会执行,因为如果控件可点击onTouchEvent就会帮我们返回true
如果不可点击就会返回false
2、布局事件
你点击了某个控件首先会调用该控件所在布局的dispatchTouchEvent方法,然后在这个方法中找到被点击控件
再调用该控件的dispatchTouchEvent。
代码中disallowIntercept(可用requestDisallowInterceptTouchEvent设置)和onInterceptTouchEvent(ev)都没有拦截事件
就会循环子view找出事件发生的子view。如果子view中没有对事件的处理,就会执行super的dispatchTouchEvent就会执行viewGroup的事件

原文地址:http://blog.csdn.net/guolin_blog/article/details/9097463

1 0
原创粉丝点击