转载自:https://blog.csdn.net/losingcarryjie/article/details/78917423#commentBox
在学习这5种滑动属性之前你需要知道的基础知识:
CoordinatorLayout,AppBarLayout
在刚开始接触CoordinatorLayout的时候我是一脸蒙逼的,心里在想”啥玩意?怎么要记这么多东西呀?”可是真的当我明白每个的用法的时候你会觉得这是多么奇妙啊
就跟你刚玩LOL的时候还在纳闷怎么要按那么多键?Q,W,E,R,P,B,D,F,手都忙不过来,但是当你真的熟练的时候你会发现么每个地方都有他的功能,带着这种态度去学习就不害怕了
CoordinatorLayout=AppBarLayout+RecyclerView
公式这么写不太严谨但是大家看起来可能会一目了然,大致明白他的意思,我们平时滑动的时候会遇到RecyclerView上部跟着一起滑动的需求(我第一次遇到是在微博的发现里面),这个时候手动处理滚动监听是一件非常复杂的事,这个时候用CoordinatorLayout就会很简单,AppBarLayout里面是RecyclerView上部的布局,这样RecyclerView滑动的时候上部的布局也会跟着滑动了,非常Material Design
大致基础普及到这里,开始进入我们的主题,先看下我们没有设置任何滑动属性的时候的原始代码:
implementation "com.google.android.material:material:1.0.0"
implementation "androidx.recyclerview:recyclerview:1.1.0"
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:minHeight="50dp"
android:layout_height="100dp"
android:layout_width="match_parent"
android:background="?attr/colorAccent"
app:tabGravity="fill"
app:layout_scrollFlags="scroll|exitUntilCollapsed"/>
</com.google.android.material.appbar.AppBarLayout>
<!--可滑动的布局内容-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
代码很简单,RecyclerView上面有一个红色的TabLayout
效果图如下:
我们发现只有RecyclerView在动,而TabLayout无论如何都不滚动
1 app:layout_scrollFlags=”scroll”
我们在TabLayout的属性里面添加上面这句话
我们发现RecyclerView向上滚动的时候,TabLayout也跟着滚动,等到TabLayout滚出屏幕之后RecyclerView还在继续滚动,下拉的时候等到拉到RecyclerView的头部TabLayout才会进入屏幕。
2 app:layout_scrollFlags=”scroll|enterAlways”
这五种属性有一个很操蛋的地方就是有的属性必须在声明其他属性之后才可以使用,下面的属性也是scroll开头,如果不声明scroll其他的都不好使。
这个属性和scroll唯一不同的地方是,只要往下拉,TabLayout就会显示出来,不必等着RecyclerView到顶部才可以显示
3 app:layout_scrollFlags=”scroll|enterAlways|enterAlwaysCollapsed”
TabLayout属性改为下面:
<android.support.design.widget.TabLayout
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
android:background="@color/colorAccent"
android:minHeight="50dp"
android:layout_height="100dp"
android:layout_width="match_parent"
/>
为了让变化更加直观,我让TabLayout的高度变成了100dp
滚出屏幕时还是和以前一样看不到tabLayout,但是滚入屏幕即手势往下拉的时候,TabLayout会和RecyclerView一起滚入50dp,然后等RecyclerView滚入到边界的时候再滚入剩下的50dp
4 app:layout_scrollFlags=”scroll|exitUntilCollapsed”
<android.support.design.widget.TabLayout
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:background="@color/colorAccent"
android:minHeight="50dp"
android:layout_height="100dp"
android:layout_width="match_parent" />
有滚入限制就会有滚出限制,如图所示,TabLayout不能完全滚出屏幕,最少也得留在屏幕上50dp,当滚入屏幕时,等RecyclerView到达边界的时候才会继续滚入
5 app:layout_scrollFlags=”scroll|snap”
将TabLayout的其他属性恢复到原始代码
这个属性很简单,就是设置吸附性效果,当你滚动TabLayout不足一半高度的时候就会回弹,高于一半的时候就会全部隐藏(即要么全部显示,要么全部隐藏)
最后要强调的是:
这5个属性不是独立使用的,有的属性必须要包含其他属性才可以使用