Behavior简介
CoordinatorLayout是个很牛的布局容器,使用它可以很方面的实现很多效果,比如支付宝首页的折叠效果,知乎首页等等,Behavior是它的一个内部抽象类,声明Behavior属性的View可以和他它依赖的兄弟元素交互,当然,这些元素都必须是CoordinatorLayout的子元素。
what?
该类是CoordinatorLayout子View之间交互的插件,有了它CoordinatorLayout的子View就可以产生联动效果。比如一个子View跟随另一个子View的移动而移动,或者是缩放,透明度变换等。
why?
一般情况下,如果要实现子View,随着上拉消失,下拉出现,我们需要在Activity中监听滚动事件,在里边处理View的显示逻辑,这样就会导致Activity中代码量变大,滚动事件中的逻辑也会变的复杂,有了CoordinatorLayout.behavior,不需要监听滚动事件,只需要自定义一个Behavior的实现类,实现几个方法就可以达到相应的效果,不需要修改activity中的代码。
how?
Behavior是CoordinatorLayout的一个内部抽象类,里边的方法有很多,如果不是要实现特别复杂的功能,只需要实现1,2个方法就可以了。常见的有两种方式:
1. 如果要依赖于CoordinatorLayout中的某个子View实现某种变化,需要实现Behavior的layoutDependsOn()和onDependentViewChanged()方法,前者会在CoordinatorLayout中通过循环的方式,找到被依赖的View,返回true,表示找到了被依赖的View,后者在每次dependency的大小,位置变化的时候都会调用,可以在这里出child的变化逻辑。
/**
* 在CoordinatorLayout中通过循环遍历的方式找到被依赖的View
*
* @param parent CoordinatorLayout
* @param child 设置了该Behavior的View
* @param dependency 被依赖的View
* @return true 标识找到了被依赖的View
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
//...
}
/**
* 每次dependency的大小或位置有所变化的时候都会调用该方法
*
* @param parent
* @param child
* @param dependency
* @return
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
//...
}
2. 如果不需要依赖于任何子View,纯粹只是想要根据滑动距离,做一些操作,可以实现onStartNestScroll()和onNestPreScroll()。
onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed, int type)