标签:
http://blog.csdn.net/guolin_blog/article/details/9097463
http://blog.csdn.net/guolin_blog/article/details/9153747
看了郭霖大神的这两篇文章,可以小小的做一个笔记
首先从全局来看,也就是ViewGroup
ViewGroup就是各种常用布局的父类
如果在ViewGroup里加入按钮,那么点击按钮时:
touch事件的层级传递
我们都知道如果给一个控件注册了touch事件,每次点击它的时候都会触发一系列的ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件。这里需要注意,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action
源码解析:
点击button时,一定会调用Button的dispatchTouchEvent方法。而这个方法不是在Button里定义的,而是在View里
dispatchTouchEvent方法的源码:
public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event); }
可以看到,onTouch执行需要两个条件:
而OnTouchEvent执行除了上述两个条件外,还需要onTouch返回false,才会执行
在onTouchEvent里,如果控件是可点击的,就会进入performClick()方法
public boolean performClick() { sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); if (mOnClickListener != null) { playSoundEffect(SoundEffectConstants.CLICK); mOnClickListener.onClick(this); return true; } return false; }
如果setOnClickListener方法调用后,就可以调用onClick方法
在此时,虽然前面onTouch返回的是false,但进入了onTouchEvent后,最终会返回一个true,使ACTION_DOWN,ACTION_MOVE,ACTION_UP等事件执行
如果控件不可点击,onTouchEvent就会直接返回false,后面的都不执行
标签:
原文地址:http://www.cnblogs.com/qlky/p/5672115.html