CoordinatorLayout

2019-05-14  本文已影响0人  zlzxm

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,

上一篇下一篇

猜你喜欢

热点阅读