CoordinatorLayout
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中的onNestedPreScrollcoorniantorlayout 中的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,