Material Design组件之AppBarLayout

原文首发于微信公众号:jzman-blog,欢迎关注交流!php

AppBarLayout 是一个垂直方向的 LinearLayout,它实现了许多符合 Material Design 设计规范的状态栏应该具备的功能,好比滚动手势。java

AppBarLayout 通常直接用做 CoordinatorLayout 的直接子对象,若是 AppBarLayout 在别的布局中使用,其大部分功能会失效,AppBarLayout 须要一个标示才可以知道滚动视图何时滚动,这个标示过程是经过绑定 AppBarLayout.ScrollingViewBehavior 类完成的,这意味着应该将滚动视图的行为设置为 AppBarLayout.ScrollingViewBehavior的一个实例,这里设置包含完整类名的字符串资源,具体以下:android

//设置layout_behavior属性
<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <!-- Your scrolling content -->
</android.support.v4.widget.NestedScrollView>
复制代码

AppBarLayout 的子 View 应该设置一个可供滚动的 behavior,能够经过代码和 xml 属性设置,具体以下:bash

//代码
setScrollFlags(int)
//xml attribute
app:layout_scrollFlags
复制代码

layout_scrollFlags 属性主要是指定 AppBarLayout 子 View 当滑动手势变化时,AppBarLayout 的子 View 执行什么动做,layout_scrollFlags 属性有 5 个值,分别是:微信

  1. scroll
  2. enterAlways
  3. enterAlwaysCollapsed
  4. exitUntilCollapsed
  5. snap

在介绍这几个属性值以前,这些属性值的效果将如下面布局效果为例,布局以下:app

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.manu.materialdesignsamples.samples.SampleCoordinatorAppBarActivity">
    <!--AppBarLayout——>子View设置layout_scrollFlags属性-->
    <android.support.design.widget.AppBarLayout android:id="@+id/ablBar" android:layout_width="match_parent" android:layout_height="wrap_content">
        <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="70dp" android:minHeight="?attr/actionBarSize" app:layout_scrollFlags="scroll">
        </android.support.v7.widget.Toolbar>
    </android.support.design.widget.AppBarLayout>
    <!--NestedScrollView——>设置layout_behavior属性-->
    <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <android.support.v7.widget.RecyclerView android:id="@+id/rvAppBarData" android:clipToPadding="true" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

复制代码

scroll: 当设置 layout_scrollFlags 的属性为以下时:布局

app:layout_scrollFlags="scroll"
复制代码

此时,上滑时先隐藏 AppBarLayout,而后再开始滚动,下滑时直到滚动视图的顶部出现 AppBarLayout 才开始显示,效果以下:学习

scroll

enterAlways: enterAlways 必须配合 scroll 来使用,当设置 layout_scrollFlags 属性为以下时:ui

app:layout_scrollFlags="scroll|enterAlways"
复制代码

此时,上滑时先隐藏AppBarLayout,而后再开始滚动,下滑时先显示AppBarLayout,而后再开始滚动,效果以下:spa

scroll_enterAlways

enterAlwaysCollapsed: 使用 enterAlwaysCollapsed 属性值时,必须配合 scroll 和 enterAlways 来使用,此外还需设置 AppBarLayout 的子 View (这里是 Toolbar)一个最小高度 来提供 enterAlwaysCollapsed 的功能支持,当设置 layout_scrollFlags 的属性为以下时:

app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
复制代码

此时,上滑时先隐藏AppBarLayout,而后再开始滚动,下滑时 AppBarLayout 先显示子 View 最小高度,而后直到滚动视图的顶部出现 AppBarLayout 所有显示,效果以下:

scroll_enterAlways_enterAlwaysCollapsed

exitUntilCollapsed: 使用 exitUntilCollapsed 属性值时,必须配合 scroll 来使用,此外还需设置 AppBarLayout 的子 View (这里是 Toolbar)一个最小高度 来提供 exitUntilCollapsed 的功能支持,当设置 layout_scrollFlags 的属性为以下时:

app:layout_scrollFlags="scroll|exitUntilCollapsed"
复制代码

此时,上滑时先隐藏 AppBarLayout 至最小高度,而后再开始滚动,下滑时直到滚动视图的顶部出现 AppBarLayout 才开始显示,效果以下:

scroll_exitUntilCollapsed

snap: 使用 snap 属性值时,必须配合 scroll 来使用,主要做用是在滚动结束时,若是伸缩的视图只是部分可见,那么它将自动滚动到最近的边缘,当设置 layout_scrollFlags 属性为以下时:

app:layout_scrollFlags="scroll|snap"
复制代码

此时,伸缩的视图(这里是 Toolbar)若是部分可见,那么伸缩的视图将自动滚动到最近的边缘,即要么隐藏、要么显示,效果以下:

scroll_snap

关于 layout_scrollFlags 属性就介绍完了,固然上面只是为了说明属性值的效果,还能够结合 CollapsingToolbarLayout 等其余 Material Design 实现酷炫的效果,上面是在布局文件对 layout_scrollFlags 属性的设置,顺便说一下如何在代码中设置 layout_scrollFlags 呢,具体以下:

AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) appBarLayout
                .getChildAt(0).getLayoutParams();
//上滑时先隐藏AppBarLayout,而后再开始滚动,下滑时先显示AppBarLayout,而后再开始滚动
params.setScrollFlags(
        AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL |
        AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
//...
复制代码

AppBarLayout 的使用及其重要属性已经介绍完了,实际开发中确定要复杂的多,但愿上面的内容可以对你有所帮助。能够选择关注我的微信公众号:jzman-blog 获取最新更新,一块儿交流学习!

j零点小筑
相关文章
相关标签/搜索