学习 详细分析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"
...