后是有返回值的 // 若该控件可点击,那么点击时dispatchTouchEvent的返回值必定是true,因此会导致条件判断成立 //...()时,对于抬起View事件,在调用performClick()时,因为设置了点击事件,所以会回调onClick()。...()、onTouchEvent()、onInterceptTouchEvent())进行重写 或 更改返回值 那么调用的是这3个方法的默认实现:调用下层的方法 & 逐层返回 事件传递情况:(呈U型)...等) 当dispatchTouchEvent()事件分发时,只有前一个事件(如ACTION_DOWN)返回true,才会收到后一个事件(ACTION_MOVE和ACTION_UP) 即如果在执行ACTION_DOWN...时返回false,后面一系列的ACTION_MOVE、ACTION_UP事件都不会执行 从上面对事件分发机制分析知: dispatchTouchEvent()、 onTouchEvent() 消费事件、
后是有返回值的 // 若该控件可点击,那么点击时dispatchTouchEvent的返回值必定是true,因此会导致条件判断成立 //...()时,对于抬起View事件,在调用performClick()时,因为设置了点击事件,所以会回调onClick()。...()、onTouchEvent()、onInterceptTouchEvent())进行重写 或 更改返回值 那么调用的是这3个方法的默认实现:调用下层的方法 & 逐层返回 事件传递情况:(呈U型) 从上往下调用...等) 当dispatchTouchEvent()事件分发时,只有前一个事件(如ACTION_DOWN)返回true,才会收到后一个事件(ACTION_MOVE和ACTION_UP) 即如果在执行ACTION_DOWN...时返回false,后面一系列的ACTION_MOVE、ACTION_UP事件都不会执行 从上面对事件分发机制分析知: dispatchTouchEvent()、 onTouchEvent() 消费事件、
Activity的onTouchEvent 方法,同时Activity的dispatchTouchEvent方法返回true; 反之返回false时,这个事件就交给Activity的onTouchEvent...(ev)返回false时,Activity的dispatchTouchEvent方法默认返回false。...dispatchTouchEvent方法片段2 变量intercepted用来标记是否要拦截该Touch事件,true表示拦截,false表示不拦截。...这里需要注意的是,如果intercepted为true,也就是ACTION_MOVE和ACTION_UP事件被拦截了,则cancelChild为true,则会分发一次ACTION_CANCLE事件。...从返回值可以看到,如果重写的OnTouch方法返回true的话,那么result的值就为true,意味着该事件被消费掉了,就不会继续执行后面的onTouchEvent方法了;否则继续执行onTouchEvent
这里分三步,第一步,如果是触摸开始类型ACTION_DOWN事件,会回调onUserInteraction()方法,所以在项目中可以考虑将一些需要用户开始触摸时就执行的代码放到此方法中;第二步,将触摸事件...事件,然后是几个ACTION_MOVE事件,最后是ACTION_UP事件。...接下来,我们给EventBtn添加onTouchListener,并返回true ? 运行App,查看打印的日志, ? ...下面我们将onTouchListener的返回值改为false,并重写EventBtn onTouchEvent方法,并返回true。 ? 运行App,点击按钮,查看打印的日志, ? ...看到源码,很一目了然,框架先调用onTouchListener,如果事件没有被消费掉,再调用onTouchEvent,最后result表示此触摸事件是否被消费,作为返回值。
ViewGroup触摸事件的传递,我们要先了解onInterceptTouchEvent()方法,这个方法默认返回false,表示ViewGroup是否拦截触摸事件,即如果返回true,拦截触摸事件,则不会将任何触摸事件...可以看到,我们的button没有接收到触摸事件,现在将onInterceptTouchEvent返回值改为false,再次运行App,点击按钮,查看打印日志, ? ...很明显,我们的按钮的触摸事件和它的父容器的触摸事件,都触发了,这是因为,我们EventBtn的onTouchListener方法和onTouchEvent方法都返回false,没有消费触摸事件,事件会向上继续传递...那么如果ViewGroup不拦截触摸事件,事件在它的子Views中又是如何传递的呢? ...同样,我们可以利用代码来验证我们上面的结论,我们打开EventBtn类中dispatchTouchEvent方法中的日志打印代码,同时我们将btn3的onTouchListener方法返回true,消费掉触摸事件
//ACTION_UP才会走到这里, 假如在ACTION_MOVE或者ACTION_UP拦截的 //Touch事件, 将ACTION_CANCEL派发给target,然后直接返回true...上面的ViewGroup的Touch事件分发就告一段落先,因为这里要调用TextView(也就是View)的dispatchTouchEvent()方法,所以我们先分析View的dispatchTouchEvent...接口的onTouch()方法的返回值了,如果调用了setTouchListener()设置OnTouchListener,并且onTouch()方法返回true,View的dispatchTouchEvent...我觉得OnTouchListener接口是对处理Touch事件的屏蔽和扩展作用吧,屏蔽作用我就不举例介绍了,看上面的源码就知道了,我就说下扩展吧,比如我们要打印View的Touch的点的坐标,我们可以自定义一个...重写了onTouchEvent(),所以这里还是调用CustomLayout的onTouchEvent(), 这个方法返回false, 不消费Touch事件,所以不会在触发ACTION_MOVE,ACTION_UP
用来进行事件分发和传递的,返回true的时候一定是自己去消费,返回false有可能是自己消费也有可能是传递给上一级的OnTouchEvent方法, super就传递给其他的view。...1.6 onClick 是一个点击事件,是在onTouchEvent的up事件里面执行的,它的优先级是最低,如果在onTouchEvent或OnTouchListener的onTouch方法如果返回true...箭头上的值表示该方法的返回值,消费框表示事件被消费掉,不会向下或者向上传递,接下来我们写代码运行一下看效果。...的点击事件响应怎么办,按照上面的andorid事件分发流程图,方法多了,我们可以在不同的阶段进行控制,不让事件向下分发,但我们试试onTouch()这个方法,此方法默认返回false,我们现在让它返回true...先让系统以为view的onTouchEvent要消费事件:在view的onTouchEvent中return true,结果如下: ?
,(return true、return false、return super.xxxxx(),super 的意思是调用父类实现。...所以如果我们没有对控件里面的方法进行重写或更改返回值,而直接用super调用父类的默认实现,那么整个事件流向应该是从Activity---->ViewGroup--->View 从上往下调用dispatchTouchEvent...true和false 都不行,那么只能通过Interceptor把事件拦截下来给自己的onTouchEvent,所以ViewGroup dispatchTouchEvent方法的super默认实现就是去调用...在这种场景下ACTION_MOVE和ACTION_UP 将如何呢,看下面的打出来的日志 ?...消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。
若返回值为True事件会传递到自己的onTouchEvent(); 若返回值为False传递到子view的dispatchTouchEvent()。...若返回值为True,事件由自己处理,后续事件序列让其处理; 若返回值为False,自己不消耗事件,向上返回让其他的父容器的onTouchEvent接受处理。...的优先级比onTouchEvent要高 如果给一个view设置了OnTouchListener,那么OnTouchListener中的onTouch方法会被回调。...这时事件如何处理还要看onTouch的返回值,如果返回false,那么当前view的onTouchEvent方法会被调用;如果返回true,那么onTouchEvent方法将不会被调用。...事件除外,即当面对ACTION_DOWN事件时,ViewGroup总是会调用自己的onInterceptTouchEvent方法来询问自己是否要拦截事件。
ACTION_MOVE:在按下的情况下,进行移动。轻微的移动都会传递到该事件。...该方法中判断事件是被消费( return true ),还是继续分发给子视图处理( return super.dispatchTouchEvent ),如果当前视图是ViewGroup或者其子类,则会调用...OnTouchEvent 方法判断,是被消费( return true ),还是不处理( return false )并将事件传递给父视图的 OnTouchEvent 方法进行处理。...由于拥有不同的返回值,所以事件传递流程也有不同,经过不断修改返回值测试,最终得到了点击事件的流程图,ACTION_DOWN 和 ACTION_UP 事件的传递流程是相同的。...),到达最内层的 View 时,将由 View 的 OnTouchEvent 方法处理,该方法返回 true 时进行消费不再传递,返回 false 时再由内向外传递,由外层的 OnTouchEvent
上面代码我们给button设置了OnTouchListener并重写了onTouch方法,方法返回值默认为false。如果这里我们返回true,那么你会发现onclick方法不执行了!!!What?...我们重点需要了解这个分发的过程,那么系统是如何去判断这个事件要给哪个View,也就是说是如何进行分发的呢?...特别注意,这是ViewGroup特有的方法,View并没有拦截方法 返回值:是否拦截事件传递,返回true表示拦截了事件,那么事件将不再向下分发而是调用View本身的onTouchEvent方法。...返回值:返回true表示事件被消费,本次的事件终止。返回false表示事件没有被消费,将调用父View的onTouchEvent方法 上面的三个方法可以用以下的伪代码来表示其之间的关系。 ?...当没有设置OnTouchListener或者设置了OnTouchListener但是onTouch方法返回false则会调用View自己的onTouchEvent方法。
ContentView中 触摸事件的类型 触摸事件对应的是MotionEvent类,事件的类型主要有如下三种: ACTION_DOWN ACTION_MOVE(移动的距离超过一定的阈值会被判定为ACTION_MOVE...拦截(onInterceptTouchEvent):方法返回值为true表示拦截这个事件并交由自身的onTouchEvent方法进行消费;返回false表示不拦截,需要继续传递给子视图。...消费(onTouchEvent):方法返回值为true表示当前视图可以处理对应的事件;返回值为false表示当前视图不处理这个事件,它会被传递给父视图的onTouchEvent方法进行处理。...因为一旦一个元素拦截了此事件,那么同一个事件序列内的所有事件都会直接交给它处理(即不会再调用这个View的拦截方法去询问它是否要拦截了,而是把剩余的ACTION_MOVE、ACTION_DOWN等事件直接交给它来处理...View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable默认为false
image 一个事件是指:一个ACTION_DOWN事件或ACTION_MOVE事件或ACTION_UP事件等。它们合称同一个事件序列。...(4)、onInterceptTouchEvent拦截方法,类似一个开关,当return true时该事件则被当前控件消费了,拦截该事件,不再往下传递了;而return false或return super.xxxxxx...down事件流程2 重要注意: (1)、如果一个View或ViewGroup的onTouchEvent不消耗ACTION_DOWN事件返回了false,那么它就不会再接收同一事件序列中的ACTION_MOVE...View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable属性默认为false...ACTION_UP事件,这里必须要返回false,假设事件交由子元素处理,如果父容器在ACTION_UP时返回了true,就会导致子元素无法接收到ACTION_UP事件,这个时候子元素中的onClick
3.因此总结,在onTouchEvent()中MotionEvent.ACTION_DOWN的返回值处理是关键;当它返回return true无论后面如何处理,它都是已经处理消费了事件,不会再往上向父容器传递事件...这条也很好理解,就是说当一个View决定拦截一个事件后,那么系统会把同一个事件序列内的其他方法都直接交给它来处理,因此就不用再调用这个View的onInterceptTouchEvent去询问它是否要拦截了...View的longClickable属性默认都为false,clickable属性要分情况,比如Button的clickable属性默认为true,而TextView的clickable属性默认为false...ACTION_UP事件,这里必须要返回false,假设事件交由子元素处理,如果父容器在ACTION_UP时返回了true,就会导致子元素无法接收到ACTION_UP事件,这个时候子元素中的onClick...方法在ACTION_UP时返回了false。
onInterceptTouchEvent 该方法只存在于viewGroup中,当一个事件需要被分发到子view时,viewGroup会调用此方法检查是否要进行拦截。...因此下面的工作流程中都是指down事件的分发 ,而不是ACTION_MOVE或ACTION_UP的分发。...view会先检查是否有onTouchListener且返回值是否为true,如果是true则直接返回,否则调用onTouchEvent方法来处理事件。 基于上述的关系,可以得到下面的工作流程图: ?...那么当viewGroup掐断事件流之后,事件的走向又是如何的呢?参看下图:(注意,这里不讨论多指操作的情况,仅讨论单指操作的move或up事件被viewGroup拦截的情况) ?...消费的原则,如果一个view消耗了down事件却在接下来的move或up事件返回了false,那么此事件不会给上层的viewGroup处理,而是直接返回false。
一个Action_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。...对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View...而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。...返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去。...如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent
注意: onTouch和onClick事件冲突问题: 当同时实现了Touch和Click事件时,会发生冲突,如何避免?在我们的onTouchListener的监听方法会返回一个boolean。...当它为false时,就会触发Click事件,当它为true时,便不会触发。我们希望在点击的时候触发点击事件,在拖动的时候实现移动效果的Touch事件。 ...那么,我们定义一个boolean key=false;在ACTION_DOWN里,使key=false。而在ACTION_MOVE中使key=true,最后返回key即可。...这样做会出现很难触发点击事件。拖动事件太容易触发。所以我们需要加点限制。在ACTION_MOVE中我们获得X、Y移动的距离。那么我们判断当期中一个的移动距离大于1的时,才执行key=true。...不过需要在UI控件全部加载完成之后才能调用,不能在onCreate()甚至onResum()中调用,否则全是0。正确的姿势是在touch时间或者click事件触发的时候调用。
内的操作 经过上面分析,我们可以知道: onTouch 事件必须返回 true 时,才会执行该方法块。...我们发现 setOnTouchListener 的 onTouch 默认返回值是 false( 不满足返回值为 true ), 这就表明他会继续去执行下一个代码块: if (!...result && onTouchEvent(event)) { result = true; } 执行这个 if 语句的过程中。首先调用了 onTouchEvent 方法。...; } }); 接着,我们发现 OnLongClick 是有返回值的,如果返回值是 false 还会接着去触发 onClick 事件,如果返回 true 的话,那么这个长按事件就直接被消费掉了(...2.4 总结 100mm 时为点击,500mm 时为长按,接着触发长按事件。 再看长按事件的返回值,如果时 true 就结束。
这个方法能够影响父View是否拦截事件,true 表示父 View 不拦截事件,false 表示父 View 拦截事件 我们先来看一张图。...箭头的上面字代表方法返回值,(return true、return false、return super.xxxxx(),super 的意思是调用父类实现。)...目前所有的图的事件是针对ACTION_DOWN的,对于ACTION_MOVE和ACTION_UP我们最后做分析。...如果dispatchTouchEvent返回 false ,则回传给父View的onTouchEvent事件处理; 如果dispatchTouchEvent返回super的话,默认会调用自己的onInterceptTouchEvent...父 View不要拦截事件,这样保证子 View 能够接受到 Action_move 事件,再在 Action_move 动作中根据自己的逻辑是否要拦截事件,不需要拦截事件的话再交给 父 View 处理
这个方法能够影响父View是否拦截事件,true 表示父 View 不拦截事件,false 表示父 View 拦截事件 我们先来看一张图。...仔细看的话,图分为3层,从上往下依次是Activity、ViewGroup、View 事件从左上角那个白色箭头开始,由 Activity 的 dispatchTouchEvent 进行分发 箭头的上面字代表方法返回值...,(return true、return false、return super.xxxxx(),super 的意思是调用父类实现。)...如果dispatchTouchEvent返回 false ,则回传给父View的onTouchEvent事件处理; 如果dispatchTouchEvent返回super的话,默认会调用自己的onInterceptTouchEvent...父 View不要拦截事件,这样保证子 View 能够接受到 Action_move 事件,再在 Action_move 动作中根据自己的逻辑是否要拦截事件,不需要拦截事件的话再交给 父 View 处理
领取专属 10元无门槛券
手把手带您无忧上云