美文网首页
CoordinatorLayout

CoordinatorLayout

作者: zlzxm | 来源:发表于2019-05-14 21:18 被阅读0次

    AppBarLayout

    一:AppBarLayout extends LinearLayout  拥有linearlayout 的特性

    二:

    三:layout_scrollFlags:

    下拉对应需要伸展appbarlayout,也就是enter,上拉折叠APPbarlayout,也就是退出;

    1.scroll (跟随滚动view滚动):  CoordinatorLayout会将滚动子view不能继续下拉的touch事件交给appbarlayout处理,上拉事件中如果标记view没有完全隐藏会让标记view隐藏(在嵌入滚动子view的内容滚动到最顶部时继续继续下拉才会显示,类似给listview添加头部了视图的效果);

    2.scroll|enterAlways(下拉操作,一直进入):滚动子view每次滚动,CoordinatorLayout都会先交给appbarlayout处理每次上拉都先让标记view上移完全隐藏,每次下拉都先让标记view下移完全显示

    3.scroll|enterAlwaysCollapsed|enterAlways(下拉操作,一直进入并且被折叠):需要给标记view设置minHeight,CoordinatorLayout都会先交给appbarlayout处理每次上拉都先让标记view上移完全隐藏,每次下拉都先让标记view下移显示minheight高度,假如滚动view已经不能再继续下拉再让标记view完全显示

    4.scroll|exitUntilCollapsed(上拉操作,进入到折叠状态)需要给标记view设置minHeight,CoordinatorLayout都会先交给appbarlayout处理每次上拉都先让标记view上移至minheigit(折叠状态),假如滚动view已经不能再继续下拉再让标记view完全显示

    直观在view的表现上1是标记view一直被隐藏,只有在滚动view不能再下拉的时候才显示,2.滚动view下拉一直显示标记view,上拉一直隐藏标记view,3。滚动view下拉一直显示折叠的标记view,滚动view上拉完全隐藏,4滚动view一直显示显示折叠的标记view,直到滚动view不能下拉的时候完全显示

    CollapsingToolbarLayout

    一:extends FrameLayout

    二:配合toolbar使用,设置了minheight为toolbar的高度

    三:contentScrim:表示 CollapsingToolbarLayout 折叠之后的“前景色”,我们看到 Toolbar 的变色,其实是因为前景色遮挡了而已

    四:layout_collapseMode:

       1.pin:在CollapsingToolbarLayout折叠过程中 标记view 位置不变(应该是通过appbar上移 标记view下移实现?然后标记view不能移出app之外? )

      2.parallax:在CollapsingToolbarLayout折叠过程中会产生位移(app:layout_collapseParallaxMultiplier = 1 不会产生位移,等同于pin,所以值越小产生的位移越大)


    NestedScrollingChildHelper

    startNestedScroll

    一直往上找到一 个 一个  一个 和能和NestedScrollingChildHelper绑定的NestedScrollingParent2

    自定义Behavior

    Behavior

    自定义behavior 和 NestedScrollingParent2还是有区别的:因为behavior是依附于coordinatorlayout,所以对于behavior 中的 回调 有自己的逻辑:

    coordinatorlayout中的onStartNestedScroll

    以上回调到coordinatorlayout中的onStartNestedScroll 他会去遍历behavior中的onStartNestedScroll 只要有一个behavior中确定拦截 他就决定拦截。

    coordinatorlayout中的onNestedPreScroll

    coorniantorlayout 中的onNestedPreScroll 回调到所有behavior中的isNestedScrollAccepted返回true的onNestedPreScroll注意是所有并且 通过中介 拦截距离最后确定coordinatorlayout最终拦截距离.

    假如 你在onNestedPreScroll中做了与事实不符的事情,比如你没消耗dy但是却说你消耗完了所有距离,然后感觉 效果根本和想象的不一样 :

    NestedScrollView#onTouchEvent方法

    1.假如在onNestedPreScroll中只有consumed[1] = dy; 这一句,他会怎么做:

     dispatchNestedPreScroll返回true      deltaY - deltaY = 0;

    Math.abs(deltaY) >this.mTouchSlop  = false;

    this.mIsBeingDragged = false; 所以mLastMotionY 一直是actiondown 中赋值;当 gety 差距越来越大。deltaY  只会差距越来越大。所以这是不正常的。

    2.假如在onNestedPreScroll中有scrollBy(0,dy/2); consumed[1] = dy; 你会发现你拖动的距离和view滚动的距离比不是2:1:

    consumed[1]  > 0     dispatchNestedPreScroll 返回true;

     deltaY - deltaY = 0;  Math.abs(deltaY) >this.mTouchSlop  = false;

    this.mIsBeingDragged = false; 所以mLastMotionY 一直是actiondown 中赋值;

    mNestedYOffset  修改到ziview的便宜值,并且vtev.offsetLocation(0.0F, (float)this.mScrollOffset[1]); 会影响gety,

    相关文章

      网友评论

          本文标题:CoordinatorLayout

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