验证中...
私信发送成功
view与ViewGroup事件分发.java
原始数据 复制代码
1、如果是自定义复合控件,如图片+文字,我再Activity里给你注册了onClick监听,期望点击它执行。那么最简单的方法就是将图片+文字的父布局,也即让其容器ViewGroup的秘书将事件拦下,这样父亲就可以执行onClick了。这时候的父亲就像一个独立的孩子一样了(View),无官一身轻,再也不用管它的孩子了,可以正常onClick onTouch.
2、如果希望一个ViewonTouch而不onClick,在onTouchreturn trueok了。
3dispatch是为了onTouch监听,onTouchEvent是为了onClick监听。
4、自定义布局时,一般情况下:
@Override
public boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);
我们可以复写,但是最后的super.***是万万不能少滴。如果少了,表示连dispatch*** onTouchEvent压根就不调用了,事件就此打住。
一、ViewdispatchTouchEventonTouchEvent
1、事件入口是dispatchTouchEvent(),它会先执行注册的onTouch监听,如果一切顺利的话,接着执行onTouchEvent,在onTouchEvent里会执行onClick监听。
2、无论是dispatchTouchEvent还是onTouchEvent,如果返回true表示这个事件已经被消费、处理了,不再往下传了。
dispathTouchEvent的源码里可以看到,如果onTouchEvent返回了true,那么它也返回true
如果dispatch***在执行onTouch监听的时候,onTouch返回了true,那么它也返回true,这个事件提前被onTouch消费掉了。
就不再执行onTouchEvent了,更别说onClick监听了。
3、我们通常在onTouch监听了设置图片一旦被触摸就改变它的背景、透明度之类的,这个onTouch表示事件的时机。而在onClick监听了去具体干某些事。
二、ViewGroupdispatchTouchEventonInterceptTouchEventonTouchEvent
再来看ViewGroup,在复写ViewGroup时可以发现它的onTouchEvent在在View里的,表示这两个方法是一样的。
dispatchTouchEvent是在ViewGroup里的,表示和ViewdispatchTouchEvent不一样,多了一个onInterceptTouchEvent函数,表示拦截的意思。
链接 打个很形象的比喻,这玩意就像个秘书、谋士。为啥View没有呢,因为它级别不够,一个Button里面是不可能有子View的。
LinearLayout(继承ViewGroup)就有孩子(子布局),这个onInterceptTouchEvent就会判断事件要不要通知它的孩子呢。
它就一句话,默认false。也就是说这个谋士默认的意见是,永远不拦截!!!!
只要有孩子,就交给孩子们处理吧。

评论列表( 0 )

你可以在登录后,对此项目发表评论

4_float_left_people 4_float_left_close