一.什么是CoordinatorLayout
CoordinatorLayout是Android官方在Design包提供的控件,来自官方的解释是:
CoordinatorLayout is a super-powered FrameLayout
它主要用于两个方面:
- 当做普通的FrameLayout作为根布局使用
- 作为一个或者多个子View进行复杂交互的容器
CoordinatorLayout存在的意义就是通过自定义Children的Behaviors(行为)来实现控件之间的交互动画效果。而像FloatingActionButton和AppBarLayout都有自己的DefaultBehavior(默认行为),所以,这两个控件更适合与CoordinatorLayout联合使用。当然,我们在使用CoordinatorLayout时,也可以自己动手编写Behavior来实现一些复杂的交互效果
二.如何使用CoordinatorLayout
添加依赖,需要添加design的依赖:implementation 'com.android.support:design:27.1.1'
三.什么是AppBarLayout
AppBarLayout是一个垂直的 LinearLayout, 它实现了很多在material designs设计中提出的概念性交互功能,也就是【滚动手势】。
四.如何使用AppBarLayout
- 添加design依赖
- 我们可以通过给它的子View进行setScrollFlags(int)或者直接在xml中增加属性app:layout_scrollFlags来设置它子View的滚动行为。
需要注意的是,AppBarLayout需要配合CoordinatorLayout进行使用,如果只是放到普通的ViewGroup中使用的话将无法实现它的效果。
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.baidu.materiald.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
app:layout_scrollFlags="scroll"
android:layout_height="wrap_content"/>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
//如果不加,子条目会被toolBar挡住一部分
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:id="@+id/rlv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.design.widget.CoordinatorLayout>
- app:layout_scrollFlags介绍
3.1 scroll
The view will be scroll in direct relation to scroll events. This flag needs to be set for any of the other flags to take effect. If any sibling views before this one do not have this flag, then this value has no effect.
View 伴随着滚动事件而滚出或滚进屏幕。注意两点:第一点,如果使用了其他值,必定要使用这个值才能起作用;第二点:如果在这个View前面的任何其他View没有设置这个值,那么这个 View的设置将失去作用。
3.2 enterAlways
When entering (scrolling on screen) the view will scroll on any downwards scroll event, regardless of whether the scrolling view is also scrolling. This is commonly referred to as the 'quick return' pattern.
快速返回模式。其实就是向下滚动时Scrolling View和View(ToolBar)之间的滚动优先级问题。对比scroll和scroll | enterAlways设置,发生向下滚动事件时,前者优先滚动Scrolling View,后者优先滚动View,当优先滚动的一方已经全部滚进屏幕之后,另一方才开始滚动。
app:layout_scrollFlags="scroll|enterAlways"
3.3 enterAlwaysCollapsed
An additional flag for 'enterAlways' which modifies the returning view to only initially scroll back to it's collapsed height. Once the scrolling view has reached the end of it's scroll range, the remainder of this view will be scrolled into view. The collapsed height is defined by the view's minimum height.
enterAlways的附加值。这里涉及到View(ToolBar)的高度和最小高度,向下滚动时,View先向下滚动最小高度值,然后Scrolling View开始滚动,到达边界时,View再向下滚动,直至显示完全。
android:layout_height="200dp"
android:minHeight="60dp"
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
3.4 exitUntilCollapsed
When exiting (scrolling off screen) the view will be scrolled until it is 'collapsed'. The collapsed height is defined by the view's minimum height.
这里也涉及到最小高度。发生向上滚动事件时,View向上滚动退出直至最小高度,然后Scrolling View开始滚动。也就是,Child View不会完全退出屏幕。
android:layout_height="200dp"
android:minHeight="60dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
3.5 snap
Upon a scroll ending, if the view is only partially visible then it will be snapped and scrolled to it's closest edge. For example, if the view only has it's bottom 25% displayed, it will be scrolled off screen completely. Conversely, if it's bottom 75% is visible then it will be scrolled fully into view.
简单理解,就是Child View滚动比例的一个吸附效果。也就是说,Child View不会存在局部显示的情况,滚动Child View的部分高度,当我们松开手指时,Child View要么向上全部滚出屏幕,要么向下全部滚进屏幕,有点类似ViewPager的左右滑动。
android:layout_height="200dp"
app:layout_scrollFlags="scroll|snap"
-
Behavior
Behavior这个名词看着陌生,但事实上我们经常简单,如:app:layout_behavior="@string/appbar_scrolling_view_behavior"
,这个一般是出现在使用Android Stuido创建Activty的时候自动创建的,他的作用是让使用这个属性的View在appbar下面滚动。而Behavior主要的使用方式其实是通过反射来实现的,我们在layout_behavior中并没有直接进行引用,而是写了包名+类名,所以Behavior是不能够被混淆的。 -
可以使用addOnOffsetChangedListener方法为AppBarLayout添加滑动偏移监听事件,
verticalOffset 参数值表示偏移值,可用appBarLayout.getTotalScrollRange()方法获取最大偏移值。
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
// TODO
}
});
网友评论