CoordinatorLayout.Behavior
CoordinatorLayout 根据 官方文档 的描述,它是一个“超级FrameLayout“,专门用来帮助实现布局中的View相互交互。我们只需要为布局里面的 Views 创建自定义的或者分配现有的 Behavior 即可。Behavior 是 Material Design 独一无二的核心,例如滑动抽屉和面板,滑动消失元素,和跟随其他空间移动的按钮等等。
我们先来看看 Behavior 是如何工作的,后面还会配上几个例子便于理解。
Behavior 用来表示同一个布局中2个或者2个以上的控件之间的交互。通常分为以下几类:
Layout-Based Behaviors:
先来看一个效果图:
当 snackbar 从底部出现的时候,FAB 会立即向上平移一个 SnackBar 的高度。
Anchoring 是 Layout-Based Behaviors 的一种,比如我们将 FAB anchored to AppBarLayout,看下面的效果图(注意观察红色的类似短信图标的按钮):
可以看到 FAB 随着 AppBarLayout 在移动,而且最后还会消失。这种 anchored to 的行为,在 CoordinatorLayout 中对应着一个属性,我们下面会说到。
Scroll-Based Behaviors
还是看上面的图,这次不看 FAB,而是观察下面的长文本。TextView 本身是不可滚动的,所以它的外面有一层 NestedScrollView 包裹。
一个 CoordinatorLayout 中有两个可以滚动的控件,一个是 AppBarLayout,一个是 NestedScrollView 。通过效果图,可以看出,他们并没有产生冲突,而是将滑动联动起来了,我们向上滚动 NestedScrollView 的时候,会向将 AppBarLayout 往上推,推到顶部之后,NestedScrollView 才开始滚动,之间没有停顿,无缝衔接。
之所以能够产生这样的行为,是因为这两个控件都被分配了一个 Behavior。
@CoordinatorLayout.DefaultBehavior(AppBarLayout.Behavior.class)
public class AppBarLayout extends LinearLayout {
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
Implementing the Behaviors
介绍完了两类 Behaviors,接下来我们看看如何自定义一个 Behavior。
首先,我们的 Behavior 必须继承至 Coordinator.Behaviors<V>,V 就是需要这个Behavior 的控件的类型。比如我想给 TextView 指定一个 Behavior,那么 V 就是 TextView 类型。
然后,Coordinator.Behaviors<V> 有一些方法需要覆盖来达到我们想要的效果,其中有3个方法尤其重要(额,还有滚动相关的方法,与第一篇是以一样的就不介绍了)。
layoutDependsOn(…)
这个方法用来决定,当前 View 需要依赖哪个 View。比如你需要根据同一布局中的 ImageView 的位置来决定自己的位置,那么就可以这样写:
override fun layoutDependsOn(parent: CoordinatorLayout, child