美文网首页
自定义Behavior

自定义Behavior

作者: 聪聪的豆芽 | 来源:发表于2017-07-31 16:23 被阅读8次

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

相关文章

网友评论

      本文标题:自定义Behavior

      本文链接:https://www.haomeiwen.com/subject/mefrlxtx.html