关于onClickListener()和onTouchListener()的事件冲突

  最近在看事件冲突  记录一下这个

  首先看一下这个代码

 

 

 

  代码很简单  一个button 设置了onClick()和 onTouch()两个点击方法  其中onTouch()的返回为false;这时候点击这个button是否会两个log都打印咧 我们测试一下

 

 

 

  结果是两个都打印了 嗯  那我们修改一下代码  将onTouch()改成true测试一下

  

 

 

  重新运行看一下结果

 

 

 可以看到onClick()已经没有执行了  或者说是被拦截了 为什么会这样咧  我们从源码的角度看一下,点击onTouch进入view.java 可以看到这个方法是在dispatchTouchEvent()下的 也就是事件分发 我们先看看这个方法做了一些什么

 

 

 前面是一些判断信息  我们直接看这儿 可以看到这里有三个判断条件  当三个条件均为true时 result为true 那么这三个条件都是什么咧

第一个条件 li 我理解的是这个点击事件的信息   而由于我们已经 new了一个 mOntouchListener  所以 li.mOTouchLIstenr 不会为空(这个其实源码里面也有,但是我有一点说不请  有大佬的话可以详细说一下)

第二个条件是一个安全判断  判断点击事件是否安全 我们正常的点击事件都是安全的 所以为true(能正常点击此条件为true)

关键是第三个 也即是第三个条件为true 整个判断为true 第三个条件为false 整个判断为false

我们看看ontouch()  为true时  也就是我们的第二种情况 后续代码做了什么 导致onClick没有执行

 

 

 

result为true 那么!result为false 所以 onTouchEvent(event)没有被执行  那么这个方法是什么  点进去看看是否和 onClick有关系

点击去之后 发现里面是onTouchEvent的一些判断还有四种情况

即 ACTION_UP,ACTION_DOWM,ACTION_MOVE,ACTION_CANCEL

我们在ACTION_UP一个个往下找   找到了这样一个方法 

 

 点进去 

 

 可以看到  这里就是 onClick的执行方法  也就说明了  onTouch()返回为true时  执行不到onClick()  

另外  上面那个方法为什么要在ACTION_UP里面寻找咧 ?

我们可以做个实验   onTouch为false时

小伙伴们可以测试一下  最开始的onClick log是什么时候打印的

试一下就知道  只有你的手离开屏幕时才会打印onClick这个log  也就是说  onClick这个方法    在  ACTION_UP里面

 

 

 

   

posted @ 2020-04-24 13:58  汤姆鼠  阅读(540)  评论(1)    收藏  举报