美文网首页
事件分发和NestedScrolling机制

事件分发和NestedScrolling机制

作者: 大灰狼zz | 来源:发表于2021-02-23 15:44 被阅读0次
    • 事件分发是这样的:子View首先得到事件处理权,处理过程中,父View可以对其拦截,但是拦截了以后就无法再还给子View(本次手势内)。
    • NestedScrolling机制是这样的:内部View在滚动的时候,首先将dx,dy交给NestedScrollingParent,NestedScrollingParent可对其进行部分消耗,剩余的部分还给内部View。

    Android事件分发机制详解与实战剖析,一张事件分发流程图,让你彻底搞明白

    image.png
    1.同一个事件序列是指从手指接触屏幕(ACTION_DOWN)的那一刻起,到手指离开屏幕(ACTION_UP)的那一刻结束,中间含不定数量的 ACTION_MOVE 事件。
    2.某个 View 一旦决定拦截事件,那么这一个事件序列都只能由它处理,并且它的 onInterceptTouchEvent() 方法也不会再调用。换句话说,比如一个 ViewGroup 里面有数个子 View,一旦 ACTION_DOWN 事件从 Activity 传到这个 ViewGroup 被其拦截,则后续的 MOVE 和 UP 等事件也不会传递到里面的子 View 中。
    3.如果一个 View 一旦开始处理事件,如果它不消耗 ACTION_DOWN 事件,即 onTouchEvent()返回为 false,那么同一事件序列中的其他事件也不会再交给它处理,直接会调用其父 View 的 onTouchEvent()。
    4.如果 View 不消耗除 ACTION_DOWN 以外的其他事件,那么这个点击事件会消失,此时父元素的 onTouchEvent() 并不会被调用,并且当然 View 可以持续收到后续的事件,最终这些消失的点击事件会传递给 Activity 处理。
    5.ViewGroup 默认不拦截事件,View 没有 onInterceptTouchEvent() 方法,一旦有事件传递给它,则直接会调用 onTouchEvent(),并且起默认都会消耗掉事件。除非它是不可点击的(即 clickable 和 longClickable 均为 false)。View 的 longClickable 默认都为 false,而 clickable 分情况,比如 Button 默认为 true,TextView 默认为 false。
    6.View 的 enable 属性不会影响 onTouchEvent() 的默认返回值,哪怕一个 View 是 disable 状态的,只要它的 clickable 或者 longClickable 有一个为 true,那么它的 onTouchEvent() 就会返回 true。
    7.requestDisallowInterceptTouchEvent() 可以在子元素中干预父元素的事件分发过程,但是无法干预 ACTION_DOWN 事件。
    8.事件优先顺序:
    setOnTouchListener() => onTouchEvent() => onClickListener()
    

    教你用两招就完美解决 Android 滑动冲突!

    【转】Android onTouch()和onTouchEvent()区别
    事件处理之onTouchEvent()和onTouch()方法精炼详解

    Android NestedScrolling机制
    Android NestedScrolling机制完全解析 带你玩转嵌套滑动
    NestedScrolling事件机制源码解析
    事件分发不够,NestedScrolling来凑

    NestedScrolling详解+示例

    NestedScrolling机制(一)——概述
    NestedScrolling机制(二)——实例
    NestedScrolling机制(三)——机制本质以及源码解析
    NestedScrolling机制(四)——最后一个例子

    相关文章

      网友评论

          本文标题:事件分发和NestedScrolling机制

          本文链接:https://www.haomeiwen.com/subject/kzthyctx.html