Behavior是Android新出的Design库里新增的布局概念。Behavior只有是CoordinatorLayout的直接子View才有意义。可以为任何View添加一个Behavior。
Behavior是一系列回调。让你有机会以非侵入的为View添加动态的依赖布局,和处理父布局(CoordinatorLayout)滑动手势的机会。不过官方只有少数几个Behavior的例子。对于理解Behavior实在不易
- 首先自定义一个Behavior。
public class MyBehavior extends CoordinatorLayout.Behavior{
2.然后必须为其定义一个构造函数,并且一定要调用父类的构造函数。因为CoordinatorLayout源码中parseBehavior()函数中直接反射调用这个构造函数。
public MyBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
3.根据自己的需求我实现父类不同的方法
/**
* 当布局发生改变的时候该方法会被调用
* @param parent CoordinatorLayout
* @param child child 设置了behavior的布局
* @param dependency 关心的布局
* @return //换回当前的布局是否是与我们有关系的控件
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, TextView child, View dependency) {
Log.e(TAG,"layoutDependsOn");
//确定我们关心的视图的类型(这里代表我们关心的布局是TextView,只要是TextView类型的view发生改变,就会调用onDependentViewChanged()方法)
return dependency instanceof TextView;
}
/**
* 当我们关心的视图发生改变的时候
* @param parent
* @param child child 设置了behavior的布局
* @param dependency 关心的布局
* @return true 我们处理了
* 在这个方法中就可以去实现我们需要实现的代码
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, TextView child, View dependency) {
Log.e(TAG,"onDependentViewChanged");
int top = dependency.getTop();
ViewCompat.offsetTopAndBottom(child,10);
return true;
}
}
/**
*启动滚动 一般判断我们的滚动方向
* @param coordinatorLayout
* @param child 绑定behavior的视图
* @param directTargetChild 目标的子视图
* @param target 关心的视图
* @param nestedScrollAxes 滚动方向
* @return
*/
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
//判断滚动方向(这里是判断他是否是竖直滚动)
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL)!=0;
}
/**
* 视图滚动的时候
* @param coordinatorLayout
* @param child 绑定behavior的视图
* @param target 关心的视图
* @param dx 横向移动的像素
* @param dy 竖向移动的像素
* @param consumed
*/
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
//获取目标滚动的值
int scrollY = target.getScrollY();
//设置我们绑定视图的值
child.setScrollY(scrollY);
}
/**
* 快速滑动的时候
* @param coordinatorLayout
* @param child 绑定behavior的视图
* @param target 关心的视图
* @param velocityX 横向滚动的速度
* @param velocityY 竖向滚动的速度
* @param consumed
* @return
*/
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) {
if(child instanceof NestedScrollView){
((NestedScrollView)child).fling((int) velocityY);
}
return true;
}
4.在任意View中添加:
app:layout_behavior=“你的Behavior包含包名的类名”也就是全路径
然后CoordinatorLayout就会反射生成你的Behavior。