CoordinatorLayout
CoordinatorLayout的子控件可以声明app:layout_behavior=""
指定行为
AppBarLayout
AppBarLayout是一种LinearLayout,AppBarLayout的直接子控件可以声明app:layout_scrollFlags
属性,来指定与可滑动控件之间的交互行为。layout_scrollFlags接受以下几种标志:
- scroll:设置View可以滑动。
如果没有设置scroll标志就无法滑动,也就没有进入退出等其他行为了。scroll标志是其他标志生效的前提。
注意如果有同层次其他View声明在这个View前面,而且没有设置scroll标志,那这个View设置的scroll标志也无法生效。 - enterAlways:任何下滑都会使View变为可见,下滑事件会先使这个View进入可见,然后才继续滑动可滑动控件。
- enterAlwaysCollapsed:配合enterAlways标志使用,当这个View指定了minHeight,而且使用了enterAlways|enterAlwaysCollapsed标志,则这个View只会进入到最小高度的折叠模式,当可滑动控件滑动到了顶部,这个View才会完全展开。
- exitUntilCollapsed:退出时会滑动到折叠状态就不再退出。没有设置这个标志的话就会完全退出。折叠状态的高度由minHeight指定,如果这个View指定了minHeight和这个标志,退出时会退出到minHeight然后固定在那里。
- snap:滑动结束时,如果这个View是部分可见,则会自动滑动到最近的边,即自动完全退出或者完全进入,不会卡在中间的半进入半退出状态。
注意:使用scroll标志的View必须声明在没有scroll标志的View之前,这样才能保证View从顶部退出,固定的View跟随其后固定在顶部。
总结:
如果只指定了scroll标志,则默认进入退出模式是
进入:进入时机是可滑动控件上滑到顶部后,这个View才滑动进入。没有折叠这个概念。
退出:退出时机是可滑动控件准备上滑的时候这个View就开始退出。View退出后才滑动可滑动控件。指定EnterAlways和EnterAlwaysCollapsed可以修改进入时机以及进入是否折叠:
EnterAlways:只要下滑就完全进入。
enterAlways|enterAlwaysCollapsed:下滑先部分进入,可滑动控件滑动到顶部后才完全进入。指定ExitUntilCollapsed无法修改退出时机,只要上滑都会退出,只能修改退出是否折叠:
ExitUntilCollapsed:上滑退出至最小高度。
CollapsingToolbarLayout
直接把Toolbar添加到AppBarLayout之中,可以指定是否滑动以及滑动的进入退出折叠行为,但是无法指定其中的元素在折叠过程中的变化行为,此时可以使用CollapsingToolbarLayout。
CollapsingToolbarLayout是一种FrameLayout,其子控件可以指定app:layout_collapseMode
属性,接受pin和parallax两种标志。
pin标志可以使所在View在折叠过程中固定在上方。
parallax标志可以实现视差效果,此时可以另外设置一个属性指定视差系数app:layout_collapseParallaxMultiplier
。
可以设置app:contentScrim
指定CollapsingToolbarLayout折叠时的颜色
CollapsingToolbarLayout和Toolbar混合使用的话,标题可以自动放大缩小,这时候title应该要设置在CollapsingToolbarLayout才能生效,而且Toolbar必须要设置高度,如果设为wrap_content会无法显示标题。
在AppBarLayout中指定主题可以设置CollapsingToolbarLayout中的标题,比如说默认标题颜色为黑色,通过在AppBarLayout中设置android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
,标题颜色就变成白色了。
如果在AppBarLayout中某个上面的控件要实现视差效果,则可以在这个控件外面包裹一层CollapsingToolbarLayout,设置collapse_mode=”parallax”即可。
SwipeDismissBehavior
这是design包内提供的一个滑动删除行为类,使用在CoordinatorLayout的直接子控件可以实现滑动删除。
// 创建SwipeDismissBehavior,可以接受目标View为泛型
final SwipeDismissBehavior<RecyclerView> swipeDismissBehavior = new SwipeDismissBehavior();
// 设置滑动方向
swipeDismissBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_ANY);
// 可以设置监听
swipeDismissBehavior.setListener(new SwipeDismissBehavior.OnDismissListener() {
@Override
public void onDismiss(View view) {
Toast.makeText(MainActivity.this, "swipe", Toast.LENGTH_SHORT).show();
}
@Override
public void onDragStateChanged(int state) {
}
});
// 获取CoordinatorLayout的布局参数
final CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) recyclerView.getLayoutParams();
// 设置滑动删除行为
layoutParams.setBehavior(swipeDismissBehavior);
FloatingActionButton
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|right|end"/>
通过指定layout_anchor属性可以设置锚点控件,指定layout_anchorGravity属性可以设置FloatingActionButton中心对齐于锚点控件的位置。
AppBarLayout折叠起来,FloatingActionButton自动消失是FAB的默认行为,如果指定了其他行为就不会自动消失了。
NestScrollView
提供behavior_overlapTop
属性,可以设置与上面控件的重叠部分大小,比如与CollapsingToolbarLayout重叠,CollapsingToolbarLayout的title可以自动调整不被覆盖住。