安卓底部表单平滑展开,如谷歌地图

24
我想重新创建Google Maps应用程序中提供的底部表现形式:

预期行为的链接。

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

我希望拥有一个底部表格,可以通过向上滑动平稳地展开,而不是捕捉到最接近的状态,而是停留在用户停止滑动的位置。

1
你找到解决方案了吗?我也很感兴趣。 - dor506
@dor506 不是的 :| 找到一些空闲时间时,我会再玩一下这个的 :D - superhrvoje
你找到解决方案了吗? - Steffen Vangsgaard
也许这篇帖子可以帮到你:https://dev59.com/dpHea4cB1Zd3GeqPp347 - Sneh Pandya
为什么不在“CollapseToolBar”中使用“map”?它可以提供平滑的滚动。 - Aditya
1个回答

4
您可以通过子类化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);
    }
}

你好,感谢你的回答。不幸的是,我无法在弹出的列表中滚动。 - Steffen Vangsgaard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接