在滚动 Activity 中使用 CustomBottomSheetBehavior 会导致工具栏后面出现空 space

Using CustomBottomSheetBehavior in an Scrolling Activity causes an empty space behind tool-bar

我最近正在使用 CustomBottomSheetBehavior 制作类似底部 sheet 行为的 googlemaps,效果很好。我只有一张 problem.please 看这张图

如果我在滚动中使用它 activity,工具栏的内容会覆盖我的列表框。所以我必须将 margin-top 添加到我的列表视图中。它可以工作,但是当我绘制 bottomsheet up 工具栏时,工具栏会上升并在它后面,有一个空的 space。这是因为我在顶部添加了一些边距以使列表的顶部可见。有什么方法可以将列表的边距顶部连接到移动底部的数量 - sheet 并且当它向上移动时减少边距值到当它向下移动时增加它?或者有更好的方法吗?

看来我必须为这项工作开发自己的 TopMarginBehavior,但我不知道该怎么做。 谢谢

  1. 创建您自己的 class 与您想要的行为相关的 (MarginTopBehavior)
  2. CoordinatorLayout.Behavior
  3. 扩展
  4. 现在您必须关注 2 个方法:layoutDependsOnonDependentViewChanged。对于第一个,您选择您的 MarginTopBehavior 遵循的视图,在本例中是 NestedScrollView。使用第二个,当卷轴移动时,您会做出反应(魔法!)。

此时你得到这个:

public class MarginTopBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {

    private FrameLayout.LayoutParams mLayoutParams;

    public MarginTopBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof NestedScrollView;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {

    }
}

onDependentViewChanged中应用的逻辑就是这样:
* 定义上限(min/max 保证金值)并控制保证金值何时达到其中一个上限。
* 当值在上限之间时更新保证金值。在这一点上,你必须实现一个关于你想要的算法(视差、线性等)。这就是我在下一个代码中调用 THE_MAGIC_ECC 的内容:

public class MarginTopBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {

    /**
     * Params of the component you want to modify the margin
     */
    private FrameLayout.LayoutParams mLayoutParams;
    /**
     * Used to access DIMENS in your project
     */
    private Context mContext;
    private int mMinYvalue;
    private int mMaxYValue;

    public MarginTopBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof NestedScrollView;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {

        if (mLayoutParams == null) {
            mLayoutParams = (FrameLayout.LayoutParams) child.getLayoutParams();
        }


        if (dependency.getY() <= mMinYvalue) {
            mLayoutParams.setMargins(0, 0, 0, 0);
            child.setLayoutParams(mLayoutParams);
            return true;
        }
        else if (dependency.getY() > mMinYvalue && dependency.getY() <= mMaxYValue) {
            int THE_MAGIC_ECC = 1 + 2 + 3;
            mLayoutParams.setMargins(0, 0, 0, THE_MAGIC_ECC );
            child.setLayoutParams(mLayoutParams);
            return true;
        }
        else {
            mLayoutParams.setMargins(0, 0, 0, 100);
            child.setLayoutParams(mLayoutParams);
            return true;
        }
    }
}