dispatchTouchEvent : 分发事件
onInterceptTouchEvent : 拦截事件
onTouchEvent : 消费事件
这个是三个方法的最基本的作用
image.png网上的图 。 https://zhuanlan.zhihu.com/p/27608989
从这个图 我们可以看到一个清晰的结构。
首先说一下 activity和view 为什么没有拦截onInterceptTouchEvent 因为这是在对顶和最下面的结构, 加上这个方法完全没有意义,
至于这几个方法的顺序问题 我们也来通过几个图 来看一下
image.png
我们可以看出来什么。viewgroup是从dispatchTouchEvent 开始 并且以他结束。中介掺杂着onInterceptTouchEvent 拦截方法。
image.png这是当 viewgroup 当中有view的时候 顺序情况
我们可以看出来的执行顺序。 就是从外层到里层去判断。
1 首先vewgroup是不是要消费这个事件。
2 vewgroup是不是拦截这个事件。
上面的两个如果都是true的话 那么这个事件都不会执行到子view的方法。
上面的图 子view 也没有消费掉这个事件onTouchEvent 返回的false,这个事件没有消费出去,也就是没有派发出去,那么子View的dispatchTouchEvent()方法返回false,把这个事件交还给上一层的ViewGroup。ViewGroup发现这个事件没有子View消费,那么就自己动手吧!将事件传给自己的onTouchEvent()方法消费。可是ViewGroup也没有消费,那么onTouchEvent()方法只能是再返回false了。同理,ViewGroup自己没有消费事件,因此他的dispatchTouchEvent()方法也返回了false。
说直白点。如果里外有好几层的话。 那么,分发机制都是从最外层开始。逐层往里面去循环。当你哪一层需要对这个事件去有反应的话。 那么就在去消费这个事件,dispatchTouchEvent 返回的true就可以。 当然ontouchevent 也肯定返回的是true。
image.pngView明确表示要消费这个事件序列,因此从ACTION_DOWN开始的所有事件就都交给他消费了。所以子View的onTouchEvent的返回值为true,表示自己需要消费这个事件,然后他的dispatchTouchEvent也返回了true,表示这一事件被自己分发了。既然自己的子View消费了事件,ViewGroup就认为这一事件是被自己分发了,因此他的dispatchTouchEvent也就返回了true。
然后在来看一个表
来源https://www.cnblogs.com/aademeng/articles/6551337.html
image.pngdispathtouchevent 方法 返回true的时候 都是代表当前view 处理掉这个事件。
所以我们思考一下。 当我们有好几层的时候。然后出现焦点混乱 是什么造成的?
明明应该滑动的不滑动。不该滑动的确实滑动了。 这个情况的出现就是焦点混乱。dispatch。。。方法就不应该是true。 你也可以理解成为 你想要你里面的结构 响应一些操作的话。 那么外面你自己定义的一个groupview dispath..和拦截方法。返回的都应该是false, 不能是true。要不下面的方法 都不会响应。
上面的表格。这个我觉得是有点问题的
image.png你的dispatchTouchEvent 方法 首先不知道是第几层。 有可能是activity 有可以是viewgroup 还有可能是view。 不是对底层的话。 都是有可能 会是向下传递的 , 因为她是返回的false。最下层的话。那么返回的就是父控件
大家 有没有这么想的。。 这样就错了。 我也这么想过 - -
还记着这个图吗,dispatchTouchEvent 这个是两部分。start 开始 和最后的return 这个是一个过程。 当他返回的时候,可能是要返回的到上面!!!
什么 不明白?
你可以理解成为一个{
return 这个才是返回值 而在他们的上面 都是一个过程的第一层的dispatchTouchEvent 不拦截 不消费,那么就会循环到childview里面去做判断。 当里面的dispatchTouchEvent 返回true的时候说明里面的{ } 搞定了 然后要给他的上层了 也就是父类,
}
所以 这几个方法 还是要区分的作用的 在说大白话一点
dispatchTouchEvent 这个值 在我们最外层的时候 返回的是 true的话。 我们里面的子view还会不会执行。 会的(如果你不拦截的话。 所以 如果 你不想子view执行的话 那么你返回值 要是true 还要拦截。这样才不会进入到子view。)
网友评论