从认识Behavior开始
在新的support design中,CoordinatorLayout可以说是最重要的一个控件了,AS在过去的版本也是推荐了这个控件用于滑动中的布局联动。 CoordinatorLayout给我们带来了一种新的事件的处理方式——behavior,你是不是还记得我们在使用CoordinatorLayout的时候,一些子view需要声明这样的属性:
示例:
注意到有一条属性:app:layout_behavior="@string/appbar_scrolling_view_behavior"
当时我不知道这是干嘛的,直接照用就行了,后来发现这玩意是一个类!而且我们还可以自定义!所以,今天这篇博客我们首先来学习一下如何自定义Behavior,之后的博客可能会看一下CoordinatorLayout是怎么处理这个Behavior的。
例如上面的appbar_scrolling_view_behavior对应的字符串其实是android.support.design.widget.AppBarLayout$ScrollingViewBehavior,这个ScrollingViewBehavior内部类指定的泛型是View,所以理论上这个Behavior我们任何的View都可以使用,我们在自定义的时候,如果不是特殊的行为,也可以直接指定泛型View。
深入理解Behavior类中的方法
自定义Behavior首先要知道我们关心的是哪个view 把它作为child 也就是app:layout_behavior属性所在的view,layoutDependsOn用来确定哪个view作为dependency,其中
public class CustomBehavior extends CoordinatorLayout.Behavior<LinearLayout>{}中的泛型表示child的类型
在自定义Behavior的时候,我们需要关心的两组四个方法,为什么分为两组呢?看一下下面两种情况
某个view监听另一个view的状态变化,例如大小、位置、显示状态等
某个view监听CoordinatorLayout里的滑动状态
对于第一种情况,我们关心的是:
layoutDependsOn方法:决定哪个view作为dependent View 如:
layoutDependsOn方法CoordinatorLayout会遍历所有子view,只要return dependency instanceOf PullRefreshLayout 返回true就表示那个view是dependency
onDependentViewChanged方法:当dependent view变化时会调用,可用来改变child view,使child随dependency 联动
onDependentViewChanged对于第二种情况,我们关心的是:
onStartNestedScroll方法:在开始滚动的时候调用,用于筛选需要处理的方向,竖直还是水平,还有一个与之对应的方法 onStopNestedScroll 在结束滑动的时候调用
onStartNestedScrollonNestedPreScroll方法。滑动前的预处理,target表示的是CoordinatorLayout中可以华东的子view 并不一定是dependency。以下例子就是recyclerview
onNestedPreScroll另外还有一个方法比较常用,onNestedPreFling,用于两个可飞速滑动的view的联动,velocityX,velocityY表示速度
注意:所有方法,比如onNestedPreScroll方法和onStopNestedScroll方法都是在手指在屏幕上未离开时的响应,onStopNestedScroll只在手指离开屏幕时调用一次
((NestedScrollView) child).fling((int)velocityY);就可以
onNestedPreFling自定义示例
第一种情况 实现两个textview跟随运动
构造方法注意一下,带有参数的这个构造必须要重载,因为在CoordinatorLayout里利用反射去获取这个Behavior的时候就是拿的这个构造。
布局文件作为dependency的textview代码
作为child的textview的behavior代码
效果总结
认识behavior的过程是艰难的,走了不少弯路,所以希望后来者可以轻松些。网上类似的介绍比较杂,需要仔细甄别,实践。通过这个小小栗子,我发现认识事物都是由浅入深,所以学习知识的时候也不必操之过急,看不懂的代码不要强行阅读,要多些消化。
参考引用: