AppBarLayout 基础总结

学习 详细分析AppBarLayout的五种ScrollFlags 的总结笔记.

AppBarLayout 是用于与导航栏(Toolbar), 顶部标签栏(TabLayout一起使用, 来达到 MD 风格中 App Bar 的一些滚动交互设计效果.

  • AppBarLayout 继承 LinearLayout, 并增加了一些滑动特性来实现交互动画效果
  • 严重依赖于协调者布局 CoordinatorLayout. 如果将它放置在其它的 ViewGroup 中, 这些滑动特性将不起作用.

滑动行为 Scrolling Behavior

定义在 AppBarLayout 中的子 View 需要明确设置各自的滑动行为:

  • 在代码中使用 setScrollFlags(int) 方法
  • 在布局中使用 app:layout_scrollFlags 属性

滑动行为的参数取值是系统定义好的五个常量, 位 AppBarLayout.LayoutParams 类中.

  • SCROLL_FLAG_SCROLL (布局中为 scroll)
  • SCROLL_FLAG_EXIT_UNTIL_COLLAPSED (布局中为 exitUntilCollapsed)
  • SCROLL_FLAG_ENTER_ALWAYS (布局中为 enterAlways)
  • SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED (布局中为 enterAlwaysCollapsed)
  • SCROLL_FLAG_SNAP (布局中为 snap)
// 在代码中
Toolbar toolbar = ... // AppBarLayout 里的 Toolbar
AppBarLayout.LayoutParams params = 
    (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | 
    AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);

// 在 XML 中
app:layout_scrollFlags="scroll|snap"

SCROLL

子 View 伴随着滚动事件而滚出或滚进屏幕.

注意两点:

  • 如果使用了其他值, 必定要使用这个值才能起作用
  • 如果在这个子 View 前面的任何其他子 View 没有设置这个值, 那么这个子 View 的设置将失去作用

ENTER_ALWAYS

本质是设置向下滚动时 Scrolling View 和子 View之间的滚动优先级.

对比:

  • scroll 优先滚动 Scrolling View
  • scroll | enterAlways 优先滚动子 View, 当优先滚动的一方已经全部滚进屏幕之后, 另一方才开始滚动.

ENTER_ALWAYS_COLLAPSED

enterAlways 的附加值. 这里涉及到子 View 的高度和最小高度, 向下滚动时, 子 View 先向下滚动最小高度值, 然后 Scrolling View 开始滚动, 到达最小高度的边界时, 子 View 再向下滚动, 直至显示完全.

...
android:layout_height="200dp"
android:minHeight="56dp"
...
app:layout_scrollFlags="scroll | enterAlways | enterAlwaysCollapsed"
...

EXIT_UNTIL_COLLAPSED

这里也涉及到最小高度. 发生向上滚动事件时, 子 View 向上滚动退出直至最小高度, 然后 Scrolling View 开始滚动. 对比 enterAlwaysCollapsed, 子 View 不会完全退出屏幕.

SNAP

子 View 不会存在局部显示的情况,滚动子 View 的部分高度,当我们松开手指时, 子 View 要么向上全部滚出屏幕, 要么向下全部滚进屏幕.

...
android:layout_height="200dp"
...
app:layout_scrollFlags="scroll|snap"
...

你可能感兴趣的:(AppBarLayout 基础总结)