你好下,
我想根据bottomSheet的slideOffset更改视图的填充。
但是当我试图在BoottomSheetBehaviour Callback上更改视图的填充时,BottomSheet的滑动速度会变慢。这是我的代码:
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetExpended = false;
} else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetExpended = true;
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
int padding = (int) (10 * slideOffset);
nestedScrollView.setPadding(padding, 0, padding, 0);
}
});
尝试更改nestedScrollview的填充。
如何解决这个问题?
答案 0 :(得分:0)
向上滑动时,slideOffset从0变为1;向下滑动时,由1变为0。如果您想从向上滑动时没有填充到向下滑动时都没有填充,那么就可以这样做。
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
behavior = BottomSheetBehavior.from(bottomSheet);
// Get Padding value outside of onSlide
final float originalPadding = getActivity().getResources().getDimension(R.dimen.original_padding);
behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetExpended = false;
} else if (newState == BottomSheetBehavior.STATE_EXPANDED) {
bottomSheetExpended = true;
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
nestedScrollView.setPadding(Math.round(originalPadding * (1 - slideOffset)),
0, Math.round(originalPadding * (1 - slideOffset)), 0);
}
});
要以相反的方式进行操作,只需不要从滑动偏移量中减去1。
注意:我只使用Math.round(),因为我是从onSlide()之外的调光资源中获取填充作为浮动的。
不要在onSlide()内做任何占用大量资源的事情,因为它被称为一堆,这可能是您的底表缓慢滑动的原因,即使它看起来并不像在这里那样。
此外,您无需跟踪“底表”的状态,因为您可以随时致电:
if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
// Bottom sheet is expanded
}
else if (behavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
// Bottom sheet is collapsed
}
onStateChanged()方法更适用于通过显示或隐藏其他视图等方式对正在更改的状态做出反应。