【问题标题】:Android Bottom Sheet smooth expanding, like Google MapsAndroid Bottom Sheet 平滑扩展,如谷歌地图
【发布时间】:2017-12-27 07:50:06
【问题描述】:

我想重新创建 Google 地图应用中提供的底部工作表行为:

Link to expected behavior.

我曾尝试使用BottomSheetBehavior 和其他几个第三方库,如 umano AndroidSlidingUpPanel,但我无法避免的问题是它们都在状态之间捕捉底部表(折叠和展开)。

我想要一个底部工作表,它可以通过向上滑动平滑展开,而不是捕捉到最近的状态,而是保持在用户停止滑动的位置。

【问题讨论】:

  • 您找到解决方案了吗?我也很感兴趣。谢谢
  • @dor506 不:|当我找到一些空闲时间时,我会更多地玩这个:D
  • 您找到解决方案了吗?
  • 这篇文章或许能帮上忙:stackoverflow.com/questions/33945085/…
  • 为什么不在CollapseToolBar 中使用地图?它可以提供平滑的滚动。

标签: android bottom-sheet


【解决方案1】:

您可以通过继承 BottomSheetBehavior 并覆盖 onTouchEvent 以提前返回 ACTION_UPACTION_CANCEL 来实现此目的。

public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    public CustomBottomSheetBehavior() {
        super();
    }

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

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {

        int action = event.getActionMasked();
        switch (action) {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                return true;
        }

        return super.onTouchEvent(parent, child, event);
    }
}

这可以防止BottomSheetBehavior 类处理这些事件并触发“展开”或“折叠”调用。

在 xml 中应用您的 CustomBottomSheetBehaviorapp:layout_behavior="com.yourpackage.CustomBottomSheetBehavior"


要在工作表完全展开或折叠时将默认功能恢复为BottomSheetBehavior,您可以添加一个标志,该标志在幻灯片偏移量达到某个值时设置。在以下示例中,仅当幻灯片偏移量介于 0.1 和 0.9 之间时,才会忽略底部工作表 ACTION_UPACTION_CANCEL 事件。

public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    private boolean isExpandedOrCollapsed;

    public CustomBottomSheetBehavior() {
        super();

        listenForSlideEvents();
    }

    public CustomBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);

        listenForSlideEvents();
    }

    void listenForSlideEvents() {
        setBottomSheetCallback(new BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                isExpandedOrCollapsed = slideOffset < 0.1f || slideOffset > 0.9f;
            }
        });
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {

        if (!isExpandedOrCollapsed) {
            int action = event.getActionMasked();
            switch (action) {
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    return true;
            }
        }

        return super.onTouchEvent(parent, child, event);
    }
}

【讨论】:

  • 您好,感谢您的回答。不幸的是,我无法在拉出的列表中滚动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多