介绍
AppBarLayout实际是一个垂直方向的LinearLayout,在它的内部做了很多滚动
事件的封装,并应用了一些Material Design的设计理念。关键
(1)CoordinatorLayout作为AppBarLayout的直接父布局;
(2)CoordinatorLayout里面包含有两个子控件,一个是AppBarLayout,一个是可以
滑动的控件(CoordinatorLayout是一个加强版FrameLayout,目前支持的滑动
控件有RecyclerView 和 NestedScrollView)
(3)外面直接子view要:
app:layout_behavior="@string/appbar_scrolling_view_behavior"
这样当滑动控件滑动时候,就会将滚动事件通知给AppBarLayout,通过关键属性:behavior
(4)AppActionBar要去处理接受到的滚动事件,它内部的子控件可以通过
app:layout_scrollFlags:
第一种:scroll:值设为scroll的View会跟随滚动事件一起发生移动。相当于这个子view和下面滑动一体
最终实现向上滚动并且实现隐藏。
第二种:enterAlways:值设为enterAlways的View,当ScrollView往下滚动时,该View会直接往下滚动。最终效果是向下滚动并且显示。
而不用考虑ScrollView是否在滚动。
第三种:exitUntilCollapsed:值设为exitUntilCollapsed的View,当这个View
要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最
小高度后,再响应ScrollView的内部滑动事件。要手动设置其最小高度
第四种:enterAlwaysCollapsed:是enterAlways的附加选项,一般跟enterAlways
一起使用,它是指,View在往下“出现”的时候,首先是enterAlways效果,
当View的高度达到最小高度时
View就暂时不去往下滚动,直到ScrollView滑动到顶部不再滑动时
View再继续往下滑动,直到滑到View的顶部结束。
也需要设置最小的高度
第五种:snap:表示子view还没有完全隐藏或显示时候,会根据当前滚动的距离,
自动选择还是隐藏还是显示。
- 提醒
(1)由于常常是tablayout+viewpager来使用,这里也做一下介绍,前面提到需要用CoordinatorLayout包裹两个
子控件,将tablayout放在appbarlayout中,将ViewPager放在下面,但是ViewPager不具有滑动属性,因此,需要viewpager里面的内容是可滑动的比如RecyclerView才可以,下面是关键代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:fitsSystemWindows="true" //关键代码,没有这句话,中间的tablayout就会只显示一般,最后滑动结束时候,也可以设置margin_top=25dp但是效果不如fitsSystemWindows好
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout //关键代码,直接包裹两个控件
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
app:layout_scrollFlags="scroll" //告诉他是可以滑动的
android:background="#000"
android:layout_width="match_parent"
android:layout_height="200dp">
</RelativeLayout>
<android.support.design.widget.TabLayout
app:layout_scrollFlags="exitUntilCollapsed" //告诉他是滑动,并且是停在顶部
app:tabIndicatorColor="@android:color/holo_blue_light"
app:tabSelectedTextColor="@android:color/holo_blue_light"
app:tabTextAppearance="@style/TabLayoutTextStyle"
android:background="#ffff"
android:id="@+id/myTabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
app:layout_behavior="@string/appbar_scrolling_view_behavior" //关键属性,如果没有这个,虽然会滑动,
//但是呢viewpager里面内容区域会和tablaout区域重叠。
android:id="@+id/myViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
//还有一点需要提醒的是,这里的viewpager没有上下滑动的属性,这里之所以可以用,使其的内容区域是可 滑动的RecyclerView,这里RecyclerView最好要配置了Adapter,但是可以不显示内容,也是可以的