1.CoordinatorLayout 协调者布局
先瞅瞅官网上怎么说的
CoordinatorLayout是一个super-powered FrameLayout 。注意:使用的时候可能会出现视图重叠的情况
主要两个使用场景 : 1.作为最顶层的layout 2.作为一个容器与一个或者多个子view交互(特定的)
通过给CoordinatorLayout的子View定义behavior可以做出很多特别的效果。可以在xml中设置layout_beheavior=""; 这个只能是CoordinatorLayout的直接子view才能响应。有一个可以直接拿来用的behavior,app:layout_behavior="@string/appbar_scrolling_view_behavior"。这个比较有用可以将该内容放在AppBarLayout的下方,而且支持滚动。
它的子view 可能会有一个锚点(anchor),这个锚点的id 必须和某个coordinatorlayout的子view 的一致,这个可以被用来定位一个浮动的view到另一块内容上。
一般实现绚丽效果会将CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout结合起来使用。
所以现在看看AppBarLayout
2.AppBarLayout
AppBarLayout是一个垂直的LinearLayout,严重依赖于CoordinatorLayout,如果使用其他的父布局,会导致其很多特性失效。AppBarLayout的直接的子view可以设置layout_scrollFlags
3.CollapsingToolbarLayout
CollapsingToolbarLayout 是FrameLayout的子类,是个实现了折叠的应用栏的Toolbar的包装类,它是作为AppbarLayout的直接子类使用的,自带跟随特点。由于继承于FrameLayout,要注意视图会覆盖的情况,要放在AppbarLayout里面使用。其直接子布局可以设定app:layout_collapseMode来设置其折叠mode。
4.behavior
系统自带的behavior有两种,xml中分别是app:layout_behavior="@string/appbar_scrolling_view_behavior"和app:layout_behavior="@string/bottom_sheet_behavior"
也就是AppBarLayout.Behavior和BottomSheetBehavior前者是专门与appbarlayout一起使用实现联动的效果。
5.自定义behavior
布局里面确定child (观察者)和 dependency(被观察者) child 将根据dependency的行动做出相应的行动
首先要在CoordinatorLayout 里写上child 和 dependency,child必须得写上layout_behavior
public class TextBehaviorextends CoordinatorLayout.Behavior<ImageView>{//观察者
public TextBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
private int mStart;
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) {
if(mStart==0){
mStart= (int) dependency.getY();
}
float precent=dependency.getY()/mStart;
child.setY(child.getHeight()*(1-precent)-child.getHeight());
return true;//一般在这个方法里写child 和dependency的关系
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) {
return dependencyinstanceof TextView;//被观察者
}
}