返回值,跟踪android源码你会知道返回的是false 作用:让自定义布局上面的所有子view 例如button imageview 等可以被点击 @Override public boolean onInterceptTouchEvent...= (int) ev.getX(); windowY = (int) ev.getY(); setOnItemClickListener(ev); } return super.onInterceptTouchEvent...(ev); } 第二种:直接返回true 作用:让自定义布局上面的所有子view不可以被点击 @Override public boolean onInterceptTouchEvent...查阅文档可以看到,ViewGroup中有一个onInterceptTouchEvent方法,我们来看一下这个方法的源码: [java] view plaincopy /** * Implement...Also, by returning true from * onTouchEvent(), you will not receive any following * events in onInterceptTouchEvent
方法, 如果return true,表示拦截, 不向下传递了 我们看一下ViewGroup中 onInterceptTouchEvent 方法的实现 ?...Paste_Image.png public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } 简单总结 我们可以发现这里..., 默认是return false, 不拦截 也就是说如果是直接extends ViewGroup, return super.onInterceptTouchEvent(ev) 就是 return...Paste_Image.png ---- 不设置 onInterceptTouchEvent时候 我们分别点击对应的位置 【1】【2】【3】 大家可以猜一猜对应的打印顺序。...给下一层 · super.onInterceptTouchEvent(ev)默认返回false,所以return super.onInterceptTouchEvent(ev),就是 return false
文章目录 1、activity中dispatchTouchEvent()和onTouchEvent() 2、ViewGroupA中重写dispatchTouchEvent 、onInterceptTouchEvent...、onTouchEvent 3、ViewGroupB中重写dispatchTouchEvent 、onInterceptTouchEvent 、onTouchEvent 4、MyView中重写dispatchTouchEvent...、onInterceptTouchEvent 、onTouchEvent 5、布局文件 6、不做任何处理的正常流程 7、ViewGroupB的onTouchEvent()返回ture 8、是7的特殊情况...(MotionEvent ev) { Log.i("_tag","ViewGroupA onInterceptTouchEvent"); return super.onInterceptTouchEvent...(MotionEvent ev) { Log.i("_tag","ViewGroupB onInterceptTouchEvent"); return super.onInterceptTouchEvent
:调用 Log:-VP1:onInterceptTouchEvent:返回:false Log:-VP2:dispatchTouchEvent:调用 Log:-VP2:onInterceptTouchEvent...:调用 Log:-VP1:onInterceptTouchEvent:返回:false Log:-VP2:dispatchTouchEvent:调用 Log:-VP2:onInterceptTouchEvent...:调用 Log:-VP1:onInterceptTouchEvent:返回:false Log:-VP2:dispatchTouchEvent:调用 Log:-VP2:onInterceptTouchEvent...:调用 Log:-VP1:onInterceptTouchEvent:返回:false Log:-VP2:dispatchTouchEvent:调用 Log:-VP2:onInterceptTouchEvent...:调用 Log:-VP1:onInterceptTouchEvent:返回:false Log:-VP2:dispatchTouchEvent:调用 Log:-VP2:onInterceptTouchEvent
当一个触屏事件产生时,正两者的响应方法有一个主要的区别就是LinearLayout有onInterceptTouchEvent方法,而Button没有onInterceptTouchEvent方法。...onInterceptTouchEvent,主要决定谁来处理(即是否拦截事件)。...假如onInterceptTouchEvent返回false,将事件(event)交自己的子元素处理(此时事件流是从外到内,从父元素到子元素)。...中返回true)的话,将不再调用onInterceptTouchEvent,直接将事件传递给自己的onTouchEvent来处理。...注意上一步,在onInterceptTouchEvent返回true的情况下,onTouchEvent将获得事件并进行具体的处理。
前言 我们知道在事件分发过程中是存在一个拦截机制的 onInterceptTouchEvent 复制代码 当它返回true则不向下分发事件,否则向下分发。...所以简单来说requestDisallowInterceptTouchEvent设置为true可以跳过onInterceptTouchEvent,不拦截事件。...上面这种的情况是在touch事件发生前设置onInterceptTouchEvent,也是我们一般的用法。但是如果事件发生过程中调用这个函数呢?...view的onInterceptTouchEvent的判断 例如父view的onInterceptTouchEvent代码如下 public boolean onInterceptTouchEvent...所以onInterceptTouchEvent中move和up的返回值设置就无效了,因为根本就不再执行这个函数了。
主要测试dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent方法调用流程。 为了时刻拿出来复习,决定发出来,与大家分享。...=true 表示的含义为MLinearLayout中的onInterceptTouchEvent方法返回值为true,通过程序运行时输出的Log来说明调用 时序。...第1种情况 L.onInterceptTouchEvent=false&& L.onTouchEvent=true &&T.onTouchEvent=true 输出下面的Log ?...第3种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=true 输出下面的Log: ?...第4种情况 L.onInterceptTouchEvent=true&& L.onTouchEvent=false 输出下面的Log: ? (标签:android、View、事件分发)
ViewGroup2的onInterceptTouchEvent()拦截down之后的事件。...消费事件指onTouchEvent()返回true,拦截事件指onInterceptTouchEvent()返回true。...disallowIntercept) { //这里调用onInterceptTouchEvent()看是否拦截事件 intercepted = onInterceptTouchEvent...情况4:ViewGroup2的onInterceptTouchEvent()拦截down之后的事件 前面研究的都是onTouchEvent()消费相关的情况,这里研究onInterceptTouchEvent...修改ViewGroup2的onInterceptTouchEvent()代码如下: int x = 0; @Override public boolean onInterceptTouchEvent(MotionEvent
ViewGroup2 dispatchTouchEvent ViewGroup2 onInterceptTouchEvent...爷爷如果不分发(dispatchTouchEvent true)了,相当于把苹果扔了,谁都不吃,包括他自己 他如果截断(onInterceptTouchEvent true),自己可以把苹果吃了(执行...onInterceptTouchEvent:决定了是否拦截该事件 false:不拦截 true:拦截---此时当前控件执行onTouchEvent方法。...(MotionEvent ev) { System.out.println(getClass().getSimpleName() + " onInterceptTouchEvent:")...(MotionEvent ev) { System.out.println(getClass().getSimpleName() + " onInterceptTouchEvent:"
Activity.onTouchEvent 方法事件传递机制 三、ViewGroup 的事件传递 1、ViewGroup.dispatchTouchEvent 方法事件传递机制 2、ViewGroup.onInterceptTouchEvent...(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } @Override public boolean...(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } 3、ViewGroup.onTouchEvent 方法事件传递机制.../** * 针对 ACTION_DOWN 事件分析 : * 事件来源 : * 本类的 onInterceptTouchEvent 方法返回 true...如果返回 false / super.onInterceptTouchEvent(ev) * 将事件传递到该方法 * 事件分发 : * 如果返回
TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg TouchEventFather ---- onInterceptTouchEvent...TouchEventChilds ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg TouchEventChilds ---- onInterceptTouchEvent...TouchEventFather ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg TouchEventFather ---- onInterceptTouchEvent...TouchEventChilds ---- dispatchTouchEvent ----> ACTION_DOWN ----> noMsg TouchEventChilds ---- onInterceptTouchEvent...如果回传的过程中,有多个可以消费的地方, 在离回传最近的地方进行消费 后面的控件获得不到监听 ---- 添加 onInterceptTouchEvent拦截 这个时候, 如果我们在Child上面,添加拦截
(boolean);进行设置,后面会详细说;而onInterceptTouchEvent(ev)可以进行复写。...disallowIntercept && onInterceptTouchEvent(ev)) 当前允许拦截且拦截了,才进入IF体,当然了默认是不会拦截的~这里执行了onInterceptTouchEvent...disallowIntercept && onInterceptTouchEvent(ev)) {...} ...复写ViewGroup的onInterceptTouchEvent方法: @Override public boolean onInterceptTouchEvent(MotionEvent ev)...原因很简单,当onInterceptTouchEvent(ev) return true的时候,会把mMotionTarget 置为null ; 2、如何不被拦截 如果ViewGroup的onInterceptTouchEvent
二、触摸事件的三个关键方法 在 Android 系统中,触摸事件的分发过程涉及到三个重要的方法:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent...2.2 onInterceptTouchEvent(MotionEvent ev) 此方法用来拦截事件。如果返回值为 true,表示拦截,否则不拦截。...在这个过程中,每个视图(如 ViewGroup)都可以通过onInterceptTouchEvent方法对事件进行拦截。如果某个视图拦截了事件,事件将不再继续传递给更深层的子视图。...在这个过程中,每个视图都可以通过onInterceptTouchEvent方法对事件进行拦截。如果事件未被拦截,最终会传递到最内层的子视图。...3.3 简化实现 在 Android 中,Touch 事件的传递涉及到三个关键的方法:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。
ViewGroup想要把事件分发给自己的onTouchEvent,需要让拦截器onInterceptTouchEvent返回true把事件拦截下来; 3....ViewGroup的拦截器onInterceptTouchEvent默认是不拦截事件的,return super.onInterceptTouchEvent相当于return false; 4....传递给子View,dispatchTouchEvent会调用super方法,super方法默认会调用拦截器onInterceptTouchEvent,在拦截器中返回false。...super等价于false ViewGroup和View的onInterceptTouchEvent对于事件的处理有两种: 1. 拦截下来,给自己的onTouchEvent处理; 2....此时ViewGroup2还要通过onInterceptTouchEvent拦截事件,从而触发onTouchEvent。 举例2: ?
onInterceptTouchEvent(MotionEvent event) 用来申明是否拦截事件继续向下分发,如果返回true,事件将不会继续向下分发,而是交由自己的onTouchEvent方法处理...B -> onInterceptTouchEvent C -> dispatchTouchEvent C -> onInterceptTouchEvent C -> onTouchEvent ACTION_DOWN...B -> dispatchTouchEvent B -> onInterceptTouchEvent C -> dispatchTouchEvent C -> onInterceptTouchEvent...情景3: 假设我们在View B的onInterceptTouchEvent中返回true,再次点击C会怎么样呢?...我们得到如下的Log记录: A -> dispatchTouchEvent A -> onInterceptTouchEvent B -> dispatchTouchEvent B -> onInterceptTouchEvent
dispatchTouchEvent(MotionEvent event) onInterceptTouchEvent(MotionEvent event) onTouchEvent(MotionEvent...onInterceptTouchEvent 由于View 作为最上层视图不会再向更上层传递事件,所以没有onInterceptTouchEvent 方法。...,不仅需要接收底层的事件(底层会调用ViewGroup的dispatchTouchEvent方法),还要将事件分发到上层,因此,在dispatchTouchEvent中,ViewGroup需要优先考虑onInterceptTouchEvent...ViewGroup的onInterceptTouchEvent返回true,表示ViewGroup决定拦截这个事件。...onInterceptTouchEvent public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.isFromSource
Android的事件分发顺序是:Activity ----> ViewGroup ----> View 涉及到的几个重要方法: dispatchTouchEvent(); onInterceptTouchEvent...(); onTouchEvent(); dispatchTouchEvent负责事件的分发,onInterceptTouchEvent()是ViewGroup中判断是否进行事件拦截的方法...ViewGroup.java public boolean dispatchTouchEvent(MotionEvent ev) { //>>> 分析2 intercepted = onInterceptTouchEvent...如果需要对事件进行拦截,可以重写ViewGroup的onInterceptTouchEvent()方法,直接return true,onInterceptTouchEvent()方法只有ViewGroup...()方法来判断是否进行事件拦截,该方法默认return false,如果我们希望进行事件拦截,可以重写该方法,return true,则事件会被消费掉,不会再分发给子view;onInterceptTouchEvent
根View在这里就是一个ViewGroup,它在接受到事件后会调用dispatchTouchEvent(),在此方法内部会通过onInterceptTouchEvent()方法判断是否拦截事件,如果onInterceptTouchEvent...如果onInterceptTouchEvent()放回false就表示它不拦截事件,事件将传给其下级的View,调用下级View的dispatchTouchEvent()。...方法,因为已经知道View不处理事件,所以没必要再通过onInterceptTouchEvent方法来判断了。...修改EventDispatchLinearLayout的onInterceptTouchEvent(),让其返回true。...@Override public boolean onInterceptTouchEvent(MotionEvent event) { Log.i(TAG, "onInterceptTouchEvent
每到一个子view,看他的onInterceptTouchEvent 方法是否拦截,ontouch是否消费方法,如果没有继续向下dispatchTouchEvent分发事件,都不处理向上传,当回到顶级,...View没有onInterceptTouchEvent()方法,有dispatchTouchEvent,一但有点击事件传递给它,它的ouTouchEvent()方法就会被调用。...收到ACTION_DOWN 询问onTouchEvent 是否处理, Button 默认处理,此后的所有事件序列都直接跨过 ViewGroup#onInterceptTouchEvent 的判断直接传递给...(移动出自己的范围,就消失了) 事件冲突 不同向嵌套 外部处理,重写父view的onInterceptTouchEvent ,MotionEvent的事件全部返回false,不拦截; 内部处理。...同向嵌套 父 View 会彻底卡住子 View 原因:抢夺条件一致,但 父 View 的 onInterceptTouchEvent() 早于子View 的 dispatchTouchEvent()
touch事件相关的3个方法: public boolean dispatchTouchEvent(MotionEvent ev); //用来分派event public boolean onInterceptTouchEvent...其中调用了onInterceptTouchEvent()和onTouchEvent(),一般不重写该方法 onInterceptTouchEvent() 用来拦截事件。...(MotionEvent ev) { Log.i("onInterceptTouchEvent", "TestScrollView"); return super.onInterceptTouchEvent...接下来要解释两个地方 1.onInterceptTouchEvent返回默认值(false)?...跟踪源码 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* * This
领取专属 10元无门槛券
手把手带您无忧上云