事件分发

事件分发
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值