Android开发艺术探索

1.View有两个方法用来响应用户的触摸事件,dispatchTouchEvent()和onTouchEvent().因为View本身就是一个触摸事件的最后响应Target,所以它没有ViewGroup的onInterceptTouchEvent()方法。(顺便提一下ViewGroup的onInterceptTouchEvent()方法,默认都是返回false,不拦截事件).

2.那么,View中OnClickListener的onClick方法什么时候被调用?咱先从View分发事件的dispatchTouchEvent方法看,

Android开发艺术探索_第1张图片


接着看22行到33行的一段逻辑,发现onTouchEvent()方法是在dispatchTouchEvent()方法中调用的,在第27行用到了OnTouchListener的onTouch()方法的返回值,而在第30行调用了onTouchEvent()方法,可以看出onTouch方法的返回值直接决定result的值,而result的值又决定了onTouchEvent方法是否会执行。从而得到结论:onTouch()必须方法返回true的时候,result才能为true,而在result为true的时候onTouchEvent方法是不会执行的,onTouch方法返回false的时候,result肯定是false,这个时候onTouchEvent方法才会执行。

2.然后再来看onTouchEvent()方法:

Android开发艺术探索_第2张图片

可以看到在在用户将手指离开屏幕的时候,也就是ACTION_UP的逻辑当中进行了一系列判断操作,最终调用了一个performClick()方法,看下这个方法代码:

Android开发艺术探索_第3张图片


看下注释: Call the View's OnClickListener, if it is defined. 解释的多好。明确的在里面调用了OnClickListener的OnClick()方法。其实在自己代码中也可以直接调用这个方法来模拟一次View的点击事件。

至此,View的OnClickListener方法调用流程基本明确了,就是在OnTouchEvent方法中的ACTION_UP中,调用了OnClick方法,需要注意的是:如果View设置了OnTouchListener并且在onTouch方法返回true,那么onTouchEvent方法不会执行,onClick方法也不会被调用。

问:那么还有别的地方会调用onClickListener的onClick()方法吗?

答:有!

全局搜索一下,还有一个callOnclick方法也调用了onClick()方法,但是这个方法并没有在事件的分发过程中被调用,不作考虑。



你可能感兴趣的:(一,Android,二,读书笔记,Android读书笔记)