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

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



接着看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()方法:


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



看下注释: 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()方法,但是这个方法并没有在事件的分发过程中被调用,不作考虑。



更多相关文章

  1. Android中persistent属性用法详解
  2. Android(安卓)View的onTouch、onClick和onLongClick事件分析
  3. Android网页WebView图片文件上传的问题
  4. Android(安卓)程式开发:(廿一)消息传递 —— 21.3 使用Intent发送短
  5. Android(安卓)UI Surface 界面绘制原理
  6. Android(安卓)View 事件分发机制详解
  7. android新特性: 底部导航栏BottomNavigationView系统库与第三方库
  8. stagefright概述
  9. Android基础(十) Service 服务

随机推荐

  1. Android(安卓)WIFI热点默认安全性的修改
  2. [51CTO]Android消息机制
  3. android获取电话号码实例
  4. Android:创建快捷方式
  5. Android(安卓)framwork 锁屏界面开发 笔
  6. Android官方入门文档[11]支持不同平台版
  7. android之Matrix
  8. 判断Android设备是否连接网络
  9. 2011.09.07——— android zxing 条形码
  10. Android(安卓)Studio 运行时出现 finishe