在滚动 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,但我不知道该怎么做。
谢谢
- 创建您自己的 class 与您想要的行为相关的 (MarginTopBehavior)
- 从
CoordinatorLayout.Behavior
扩展
- 现在您必须关注 2 个方法:
layoutDependsOn
和 onDependentViewChanged
。对于第一个,您选择您的 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;
}
}
}
我最近正在使用 CustomBottomSheetBehavior 制作类似底部 sheet 行为的 googlemaps,效果很好。我只有一张 problem.please 看这张图
如果我在滚动中使用它 activity,工具栏的内容会覆盖我的列表框。所以我必须将 margin-top 添加到我的列表视图中。它可以工作,但是当我绘制 bottomsheet up 工具栏时,工具栏会上升并在它后面,有一个空的 space。这是因为我在顶部添加了一些边距以使列表的顶部可见。有什么方法可以将列表的边距顶部连接到移动底部的数量 - sheet 并且当它向上移动时减少边距值到当它向下移动时增加它?或者有更好的方法吗?
看来我必须为这项工作开发自己的 TopMarginBehavior,但我不知道该怎么做。 谢谢
- 创建您自己的 class 与您想要的行为相关的 (MarginTopBehavior)
- 从
CoordinatorLayout.Behavior
扩展
- 现在您必须关注 2 个方法:
layoutDependsOn
和onDependentViewChanged
。对于第一个,您选择您的 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;
}
}
}