Coordinatelayout的使用

CoordinatorLayout是用来协调其子view们之间动作的一个父view,而Behavior就是用来给CoordinatorLayout的子view们实现交互的。 AppBarLayout里面定义的view只要设置了app:layout_scrollFlags属性,就可以在View滚动事件发生的时候被触发.

app:layout_scrollFlags

注意:如果要给AppBarLayout里面的其他的控件设置app:layout_scrollFlags属性必须先要给toorbar设置app:layout_scrollFlags才能使其他的控件的属性生效.

app:layout_scrollFlags属性里面必须至少启用scroll这个flag,这样这个view才会滚动出屏幕,否则它将一直固定在顶部。

layout_scrollFlags设置上snap值则可以避免进入动画中间状态( mid-animation-states), 这意味着动画会一直持续到View完全显示或完全隐藏为止。

可以使用的其他flag有:

  1. scroll:所有想滚动出屏幕的view都需要设置这个flag,没有设置这个flag的view将被固定在屏幕顶部。例如,TabLayout 没有设置这个值,将会停留在屏幕顶部。
  2. enterAlways: 一旦向上滚动这个view就可见(比如Toolbar)。
  3. enterAlwaysCollapsed:(滚动到顶部的时候才显示)顾名思义,这个flag定义的是何时进入(已经消失之后何时再次显示)。假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。
  4. exitUntilCollapsed:同样顾名思义,这个flag时定义何时退出,当你定义了一个minHeight,这个view将在滚动到达这个最小高度的时候消失。记住,要把带有scrollflag的view放在前面,这样收回的view才能让正常退出,而固定的view继续留在顶部。
  5. contentScrim: 设置当完全CollapsingToolbarLayout折叠(收缩)后的背景颜色。expandedTitleMarginStart - 设置扩张时候(还没有收缩时)title向左填充的距离。
app:layout_behavior

support library包含了一个特殊的字符串资源@string/appbar_scrolling_view_behavior,它和AppBarLayout.ScrollingViewBehavior相匹配用来通知AppBarLayout这个特殊的view何时发生了滚动事件,这个behavior需要设置在触发事件(滚动)的view之上。当CoordinatorLayout发现RecyclerView(或者是其他可以滚动的View)中定义了这个属性,它会搜索自己所包含的其他view,看看是否有view与这个behavior相关联。AppBarLayout.ScrollingViewBehavior描述了RecyclerView与AppBarLayout之间的依赖关系。RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变.

AppbarLayout的强大管理能力是通过在View上设置不同scroll flags实现的。

二、自定义behavior

  1. 我们需要继承CoordinatorLayout.Behavior,T是指某一个View, 在我们的例子中是ImageView.

  2. 继承后,我们必须实现以下2个方法:

/**
* 判断child的布局是否依赖dependency
*/
   @Override
 public boolean layoutDependsOn(CoordinatorLayout parent, T child, View dependency) {
    boolean rs;
    //根据逻辑判断rs的取值
    //返回false表示child不依赖dependency,ture表示依赖
    return rs;  
}

/**
* 当dependency发生改变时(位置、宽高等),执行这个函数
* 返回true表示child的位置或者是宽高要发生改变,否则就返回false
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, T child, View dependency) {
     //child要执行的具体动作
        return true;
}
layoutDependsOn()
onDependentViewChanged()

layoutDependsOn方法在每次layout发生变化时都会调用,我们需要在dependency控件发生变化时返回True.

例如:

@Override
  public boolean layoutDependsOn(     
     CoordinatorLayout parent,
     CircleImageView, child,
     View dependency) {

     return dependency instanceof Toolbar;
 }

一旦layoutDependsOn返回了True,第二个方法onDependentViewChanged就会被调用,在这个方法里我们需要实现动画,转场等效果。

你可能感兴趣的:(Coordinatelayout的使用)