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;
}