代码之家  ›  专栏  ›  技术社区  ›  user8395760

底板滑动非常缓慢

  •  0
  • user8395760  · 技术社区  · 7 年前

    你好 ,
    我想根据bottomSheet的slideOffset更改视图的填充。 但当我试图更改BoottomSheetBehavior回调上视图的填充时,底部工作表的滑动速度变慢了。这是我的代码:

    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的填充。
    如何解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Carson J.    6 年前

    向上滑动时,slideOffset从0变为1,向下滑动时,slideOffset从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。

    注:我只使用数学。round(),因为我从dimens资源中获取作为浮点的填充 onSlide()外部 .

    不要在onSlide()内部做太多资源密集型的事情,因为它会被称为一堆,这可能是你的底部滑动缓慢的原因,尽管看起来你在这里并没有这样做。

    此外,您不需要跟踪底部工作表的状态,因为您可以随时调用:

    if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
      // Bottom sheet is expanded 
    }
    else if (behavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
      // Bottom sheet is collapsed
    }
    

    onStateChanged()方法更适合于通过显示或隐藏其他视图等方式对更改的状态作出反应。