Android支持BottomSheetBehavior附加锚定状态

Jef*_*art 5 android android-support-library android-design-library bottom-sheet

我一直在我的应用程序中使用AndroidSlidingUpPanel库.对于自23.1.1以来的Android设计支持库版本,这会破坏我的布局中的一些内容.由于最新版本引入了BottomSheetBehavior,我正在寻找替换AndroidSlidingUpPanel库并改为使用BottomSheetBehavior.但是,BottomSheetBehavior只有3个状态,隐藏,折叠和展开(以及2个中间状态拖动和稳定).AndroidSlidingUpPanel还具有锚定状态,这是面板在折叠和展开之间捕捉到的状态.我怎么能使用BottomSheetBehavior并获得这个额外的锚定状态?

例如,谷歌的地图应用就有这种行为.

隐:

折叠:

拖动(折叠和锚定之间):

锚定:

拖动(在锚定和扩展之间):

扩展:

当位置具有锚定状态时,可选图像在地图上向上滑动时会出现一些视差效果.当完全展开时,位置名称将成为操作栏标题.我最终也有兴趣实现类似的东西.

我的第一直觉是锚定状态实际上是扩展状态,在面板上方有空的空间,地图仍然可见,是视图的透明部分.然后,锚定和展开状态之间的拖动只是滚动面板视图本身的内容.

这可以通过以下事实得到验证:在锚定状态下,您可以通过滑动面板上方的可见地图区域继续向上滚动面板.视图的这个不可见部分必须在从折叠状态向上滑动的同时扩展到其区域(如可选图像可见),因为在折叠状态下无法从地图向上滑动面板.我想我可以走这条路,但想知道那里是否有更好的方法.

Mig*_*ieC 11

大的更新 因为有关于同一主题的4或5个问题,但有不同的requeriments,我试图回答所有这些非礼貌的管理员删除/关闭他们让我为每个人创建一张票并更改它们以避免"复制粘贴" "我会告诉你一个完整答案的链接,在那里你可以找到关于如何获得谷歌地图等完整行为的所有解释.


回答你的问题

我怎么能使用BottomSheetBehavior并获得这个额外的锚定状态?

你可以BottomSheetBehavior通过以下步骤修改默认添加一个stat:

  1. 创建一个Java类并从中扩展它 CoordinatorLayout.Behavior<V>
  2. 将粘贴代码从默认BottomSheetBehavior文件复制到新文件.
  3. clampViewPositionVertical使用以下代码修改方法:

    @Override public int clampViewPositionVertical(View child,int top,int dy){return constrain(top,mMinOffset,mHideable?mParentHeight:mMaxOffset); } int constrain(int amount,int low,int high){return amount <low?低:(金额>高?高:金额); }

  4. 添加新状态

    public static final int STATE_ANCHOR_POINT = X;

  5. 修改下一个方法:public static final int STATE_ANCHOR_POINT = X;,onLayoutChild,onStopNestedScrollBottomSheetBehavior<V> from(V view)(可选)



我将添加这些修改过的方法和示例项目链接

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
        return constrain(top, mMinOffset, mHideable ? mParentHeight : mMaxOffset);
    }

    int constrain(int amount, int low, int high) {
        return amount < low ? low : (amount > high ? high : amount);
    }
Run Code Online (Sandbox Code Playgroud)



你甚至可以使用回调 setState

以下是它的外观:
[CustomBottomSheetBehavior]