一、Toolbar

布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. xmlns:app="http://schemas.android.com/apk/res-auto">
  6. <com.google.android.material.appbar.AppBarLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content">
  9. <androidx.appcompat.widget.Toolbar
  10. android:id="@+id/tb_tb_scroll_tb"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. app:navigationIcon="@mipmap/ic_navigation_back_white"
  14. app:title="toolbar滚动"
  15. app:titleTextColor="@color/white"
  16. android:background="@color/blue_74D3FF"
  17. app:layout_scrollFlags="scroll|enterAlways|snap"/>
  18. </com.google.android.material.appbar.AppBarLayout>
  19. <include layout="@layout/content_scrolling"/>
  20. <!-- <androidx.core.widget.NestedScrollView-->
  21. <!-- android:layout_width="match_parent"-->
  22. <!-- android:layout_height="match_parent"-->
  23. <!-- app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">-->
  24. <!-- <TextView-->
  25. <!-- android:layout_width="wrap_content"-->
  26. <!-- android:layout_height="wrap_content"-->
  27. <!-- android:layout_margin="@dimen/m12"-->
  28. <!-- android:text="@string/large_text" />-->
  29. <!-- </androidx.core.widget.NestedScrollView>-->
  30. <!-- 加个底部滑动隐藏,适用于底部有控件的情况,上滑显示,-->
  31. <RelativeLayout
  32. android:layout_width="match_parent"
  33. android:layout_height="50dp"
  34. android:layout_gravity="bottom"
  35. android:background="@color/yellow_FF9B52"
  36. app:layout_behavior="@string/bottom_navigation_behavior">
  37. </RelativeLayout>
  38. <!-- 悬浮按钮-->
  39. <com.google.android.material.floatingactionbutton.FloatingActionButton
  40. android:id="@+id/fab_tb_scroll_menu"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:layout_gravity="end|bottom"
  44. android:layout_marginEnd="@dimen/m12"
  45. android:layout_marginBottom="60dp"
  46. android:src="@drawable/ic_cloud"
  47. app:layout_behavior=".design.behavior.fab.ScrollAwareFABBehavior"
  48. />
  49. </androidx.coordinatorlayout.widget.CoordinatorLayout>

终点关注AppBarLayout中的 Toolbar的这个属性layout_scrollFlags:

1.1 scroll

值设为scroll的View会跟随滚动事件一起发生移动。就是当指定的ScrollView发生滚动时,该View也跟随一起滚动,就好像这个View也是属于这个ScrollView一样。

效果图:
iShot2020-08-1820.53.56.gif

1.2 enterAlways

值设为enterAlways的View,当任何时候ScrollView往下滚动时,该View会直接往下滚动。而不用考虑ScrollView是否在滚动到最顶部还是哪里。

iShot2020-08-1820.57.06.gif

1.3 exitUntilCollapsed

值设为exitUntilCollapsed的View,当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应ScrollView的内部滑动事件。

这个一般在 toolbar中用不到,只有固定高度时,没有滚动。设置了最小高度后才有效果。

  1. android:minHeight="20dp"
  2. app:layout_scrollFlags="scroll|exitUntilCollapsed"

iShot2020-08-1821.01.51.gif

1.4 enterAlwaysCollapsed

是enterAlways的附加选项,一般跟enterAlways一起使用,它是指,View在往下“出现”的时候,首先是enterAlways效果,当View的高度达到最小高度时,View就暂时不去往下滚动,直到ScrollView滑动到顶部不再滑动时,View再继续往下滑动,直到滑到View的顶部结束

同上,当 Toolbar 是固定高度时,设置了最小高度才有效果。
iShot2020-08-1821.05.30.gif

1.5 snap

简单理解,就是Child View滚动比例的一个吸附效果。也就是说,Child View不会存在局部显示的情况,滚动Child View的部分高度,当我们松开手指时,Child View要么向上全部滚出屏幕,要么向下全部滚进屏幕,有点类似ViewPager的左右滑动

当toolbar还没有显示或隐藏时,会根据当前的距离自动选择显示还是隐藏.
iShot2020-08-1821.08.24.gif

二、在 CollaspingToolbarLayout中使用

CollapsingToolbarLayout是用来对Toolbar进行再次包装的ViewGroup,主要是用于实现折叠(其实就是看起来像伸缩~)的App Bar效果。它需要放在AppBarLayout布局里面,并且作为AppBarLayout的直接子View。CollapsingToolbarLayout主要包括几个功能(参照了官方网站上内容,略加自己的理解进行解释):

(1) 折叠Title(Collapsing title):当布局内容全部显示出来时,title是最大的,但是随着View逐步移出屏幕顶部,title变得越来越小。你可以通过调用setTitle方法来设置title。

(2)内容纱布(Content scrim):根据滚动的位置是否到达一个阀值,来决定是否对View“盖上纱布”。可以通过setContentScrim(Drawable)来设置纱布的图片. 默认contentScrim是colorPrimary的色值

(3)状态栏纱布(Status bar scrim):根据滚动位置是否到达一个阀值决定是否对状态栏“盖上纱布”,你可以通过setStatusBarScrim(Drawable)来设置纱布图片,但是只能在LOLLIPOP设备上面有作用。默认statusBarScrim是colorPrimaryDark的色值.

(4)视差滚动子View(Parallax scrolling children): 子View可以选择在当前的布局当时是否以“视差”的方式来跟随滚动。(PS:其实就是让这个View的滚动的速度比其他正常滚动的View速度稍微慢一点)。将布局参数app:layout_collapseMode设为parallax

(5)将子View位置固定(Pinned position children):子View可以选择是否在全局空间上固定位置,这对于Toolbar来说非常有用,因为当布局在移动时,可以将Toolbar固定位置而不受移动的影响。 将app:layout_collapseMode设为pin。

    1. 不设置contentScrim的效果图

image.gif

    1. 设置contentScrim

iShot2020-08-1821.28.41.gif

    1. 设置 Toolbar 一起滚动

只要修改layout_scrollFlags:

  1. app:layout_scrollFlags="scroll|enterAlways"

image.gif

参考

AppbarLayout的简单用法
Material Design之 AppbarLayout 开发实践总结