http://blog.csdn.net/qibin0506/article/details/50290421
http://blog.csdn.net/lmj623565791/article/details/52204039
1、一定要重载这个构造函数
public Behavior(Context context, AttributeSet attrs) {
}
2、设定是否依赖判断
/**
* @param child 设定behavior的view
* @param dependency 关注的view
* @return 是否进行依赖,默认false,可根据条件进行动态判断
*/
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return true;
}
3、设定child是否跟随关注view(dependency)是否变化,位置和大小
/**
* @param child 设定behavior的view
* @param dependency 关注的view
* @return 关注view(dependency)变化时,child是否变化,默认false-不变化。而且这里只变化view的大小和位置
*/
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
int offset = dependency.getTop() - child.getTop();
ViewCompat.offsetTopAndBottom(child, offset);
return true;
}
4、滑动的判断
/**
* 该方法,一定要按照自己的需求返回true,该方法决定了当前控件是否能接收到其内部View(并非是直接
* 子View)滑动时的参数;假设你只涉及到纵向滑动,这里可以根据nestedScrollAxes这个参数,进行纵向判断。
*/
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
5、是否消耗滑动
/**
* 该方法的会传入内部View移动的dx,dy,如果你需要消耗一定的dx,dy,就通过最后一个参数consumed进行
* 指定,例如我要消耗一半的dy,就可以写consumed[1]=dy/2
*/
@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 leftScrolled = target.getScrollY();
child.setScrollY(leftScrolled);
}
6、捕获对内部View的fling事件
/**
* 你可以捕获对内部View的fling事件,如果return true则表示拦截掉内部View的事件。
*/
@Override
public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY) {
((NestedScrollView) child).fling((int) velocityY);
((NestedScrollView) target).fling((int) velocityY);
return true;
}