您的位置:首页 > 移动开发

Android Design Support Library之CoordinatorLayout,AppBarLayout

2015-11-16 21:20 459 查看
  在上一篇文章(点我)中我们提到了CoordinatorLayout。CoordinatorLayout是这次新添加的一个增强型的FrameLayout。在CoordinatorLayout中,我们可以在FrameLayout的基础上完成很多新的操作。可以说,CoordinatorLayout是support library的重中之重。它从另一层面去控制子view之间触摸事件的布局,Design library中的很多控件都利用了它。从上一篇文章中我们就实现了将FloatingActionButton作为一个子View添加进CoordinatorLayout并且将CoordinatorLayout传递给 Snackbar.make(),在3.0及其以上的设备上,Snackbar不会显示在悬浮按钮的上面,而是FloatingActionButton利用CoordinatorLayout提供的回调方法,在Snackbar以动画效果进入的时候自动向上移动让出位置,并且在Snackbar动画地消失的时候回到原来的位置,不需要额外的代码。

  下面我们来看看怎么将toolbar滑动出屏幕的实现:

  先看布局文件:

 

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cl_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rcv_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v7.widget.RecyclerView>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<android.support.v7.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:id="@+id/toolbar"
app:layout_scrollFlags="scroll|enterAlways">

</android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
android:src="@mipmap/ic_plus"/>
</android.support.design.widget.CoordinatorLayout>


这里需要一个可以滚动的组件,例如RecyclerView、 NestedScrollView( 这里需要注意的是,目前只支持RecyclerView、 NestedScrollView,如果你用一个ScrollView,是没有效果的 )。如果:

1、给这个可滚动组件设置了layout_behavior

2、给另一个控件设置了layout_scrollFlags

那么,当设置了layout_behavior的控件滑动时,就会触发设置了layout_scrollFlags的控件发生状态的改变。

  从上边可以看出,如果想让toolbar滑出屏幕,就得先给可滚动的组件(我用的是RecyclerView)设置layout_behavior,即:app:layout_behavior=”@string/appbar_scrolling_view_behavior” 。然后在给toolbar设置layout_scrollFlags,如果是要滑出屏幕需要设置app:layout_scrollFlags=”scroll|enterAlways”。

  设置的layout_scrollFlags有如下几种选项:

  scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。

  enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。

  enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。

exitUntilCollapsed: this flag causes the view to scroll off until it is ‘collapsed’ (its minHeight) before exiting。


  需要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,而前面两种模式基本是需要一起使用的,也就是说,这些flag的使用场景,基本已经固定了。我们使用的就是app:layout_scrollFlags=”scroll|enterAlways”。

  这里还必须强调一下所有使用scrollFlags的view都必须定义在没有使用scroll flag的view的前面,这样才能确保所有的view从顶部退出,留下固定的元素。

  


  

  项目地址:github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: