当前位置:  开发笔记 > Android > 正文

如何模仿谷歌地图的底层3阶段行为?

如何解决《如何模仿谷歌地图的底层3阶段行为?》经验,为你挑选了2个好方法。

注意:阅读底部的编辑


好的,我已经找到了一种方法,但我必须更改多个类的代码,以便底部的表格知道appBarLayout的状态(是否展开),如果它是的话,忽略向上滚动没有扩大:

BottomSheetLayout.java

添加字段:

private AppBarLayout mAppBarLayout;
private OnOffsetChangedListener mOnOffsetChangedListener;
private int mAppBarLayoutOffset;

init() - 添加了这个:

    mOnOffsetChangedListener = new OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {
            mAppBarLayoutOffset = verticalOffset;
        }
    };

添加了设置appBarLayout的功能:

public void setAppBarLayout(final AppBarLayout appBarLayout) {
    if (mAppBarLayout == appBarLayout)
        return;
    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);
    mAppBarLayout = appBarLayout;
    mAppBarLayout.addOnOffsetChangedListener(mOnOffsetChangedListener);
}

onDetachedFromWindow() - 添加了这个:

    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);

onTouchEvent() - 添加了这个:

      ...
      if (bottomSheetOwnsTouch) {
        if (state == State.EXPANDED && scrollingDown && mAppBarLayout != null && mAppBarLayoutOffset != 0) {
            event.offsetLocation(0, sheetTranslation - getHeight());
            getSheetView().dispatchTouchEvent(event);
            return true;
        }
      ...

那是主要的变化.现在为他们设置:

MyFragment.java

onCreateView() - 添加了这个:

    mBottomSheetLayout.setAppBarLayout((AppBarLayout) view.findViewById(R.id.appbar));

我还添加了这个功能:

 public void setBottomSheetLayout(final BottomSheetLayout bottomSheetLayout) {
    mBottomSheetLayout = bottomSheetLayout;
}

现在,这是活动告诉片段关于appBarLayout的方式:

            final MyFragment myFragment = new MyFragment();
            myFragment.setBottomSheetLayout(bottomSheetLayout);
            myFragment.show(getSupportFragmentManager(), R.id.bottomsheet);

项目现在可以在GitHub上获得:

https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet

我希望它没有任何错误.


遗憾的是,解决方案存在错误,因此我不会将此答案标记为正确答案:

    它仅适用于Android 6及更高版本.其他人有一种奇怪的行为,即每次显示时,底片都会膨胀一小部分时间.

    方向更改根本不保存滚动状态,所以我已禁用它.

    罕见的问题是,当它仍在折叠时(在底部)能够滚动底部内容的内容

    如果之前显示过键盘,则在尝试偷看时,底部工作表可能会全屏显示.

如果有人可以提供帮助,请这样做.


对于问题#1,我尝试通过在未查看底部工作表时将可见性设置为INVISIBLE来添加修复,但它并不总是有效,尤其是在显示键盘的情况下.


对于问题#1,我已经找到了如何修复它,只需将CoordinatorLayout包装(在"fragment_my.xml"中)与你想要使用的任何视图(我使用FrameLayout),并且还放入一个完整大小的视图它(我只是把"视图"),因此:


    
    

    <...CollapsingToolbarLayout 
    ...

当我将CoordinatorLayout视为其视图时,它可能会混淆bottomSheet.我已经更新了项目,但是,如果有任何方法可以提供更好的解决方案,我想知道它.


最近几个月,Google已经发布了自己的bottomSheet类,但是我发现它有很多问题,所以我甚至无法尝试.



1> android deve..:

注意:阅读底部的编辑


好的,我已经找到了一种方法,但我必须更改多个类的代码,以便底部的表格知道appBarLayout的状态(是否展开),如果它是的话,忽略向上滚动没有扩大:

BottomSheetLayout.java

添加字段:

private AppBarLayout mAppBarLayout;
private OnOffsetChangedListener mOnOffsetChangedListener;
private int mAppBarLayoutOffset;

init() - 添加了这个:

    mOnOffsetChangedListener = new OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {
            mAppBarLayoutOffset = verticalOffset;
        }
    };

添加了设置appBarLayout的功能:

public void setAppBarLayout(final AppBarLayout appBarLayout) {
    if (mAppBarLayout == appBarLayout)
        return;
    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);
    mAppBarLayout = appBarLayout;
    mAppBarLayout.addOnOffsetChangedListener(mOnOffsetChangedListener);
}

onDetachedFromWindow() - 添加了这个:

    if (mAppBarLayout != null)
        mAppBarLayout.removeOnOffsetChangedListener(mOnOffsetChangedListener);

onTouchEvent() - 添加了这个:

      ...
      if (bottomSheetOwnsTouch) {
        if (state == State.EXPANDED && scrollingDown && mAppBarLayout != null && mAppBarLayoutOffset != 0) {
            event.offsetLocation(0, sheetTranslation - getHeight());
            getSheetView().dispatchTouchEvent(event);
            return true;
        }
      ...

那是主要的变化.现在为他们设置:

MyFragment.java

onCreateView() - 添加了这个:

    mBottomSheetLayout.setAppBarLayout((AppBarLayout) view.findViewById(R.id.appbar));

我还添加了这个功能:

 public void setBottomSheetLayout(final BottomSheetLayout bottomSheetLayout) {
    mBottomSheetLayout = bottomSheetLayout;
}

现在,这是活动告诉片段关于appBarLayout的方式:

            final MyFragment myFragment = new MyFragment();
            myFragment.setBottomSheetLayout(bottomSheetLayout);
            myFragment.show(getSupportFragmentManager(), R.id.bottomsheet);

项目现在可以在GitHub上获得:

https://github.com/AndroidDeveloperLB/ThreePhasesBottomSheet

我希望它没有任何错误.


遗憾的是,解决方案存在错误,因此我不会将此答案标记为正确答案:

    它仅适用于Android 6及更高版本.其他人有一种奇怪的行为,即每次显示时,底片都会膨胀一小部分时间.

    方向更改根本不保存滚动状态,所以我已禁用它.

    罕见的问题是,当它仍在折叠时(在底部)能够滚动底部内容的内容

    如果之前显示过键盘,则在尝试偷看时,底部工作表可能会全屏显示.

如果有人可以提供帮助,请这样做.


对于问题#1,我尝试通过在未查看底部工作表时将可见性设置为INVISIBLE来添加修复,但它并不总是有效,尤其是在显示键盘的情况下.


对于问题#1,我已经找到了如何修复它,只需将CoordinatorLayout包装(在"fragment_my.xml"中)与你想要使用的任何视图(我使用FrameLayout),并且还放入一个完整大小的视图它(我只是把"视图"),因此:


    
    

    <...CollapsingToolbarLayout 
    ...

当我将CoordinatorLayout视为其视图时,它可能会混淆bottomSheet.我已经更新了项目,但是,如果有任何方法可以提供更好的解决方案,我想知道它.


最近几个月,Google已经发布了自己的bottomSheet类,但是我发现它有很多问题,所以我甚至无法尝试.


@Hardy你最终创建了你想要的解决方案吗?如果是开源,可以共享吗?

2> MiguelHincap..:

大新闻

因为有关于同一主题的4或5个问题,但有不同的要求,我试图回答所有这些,但是非礼貌的管理员删除/关闭它们,让我为每个创建一个票并将它们更改为避免"复制粘贴"我将为您提供完整答案的链接,您可以在其中找到有关如何获得Google地图等完整行为的所有说明.


回答你的问题

如何模仿谷歌地图的底层3阶段行为?

使用支持库23.x.x +,您可以修改默认值BottomSheetBehavior,添加一个以下步骤:

    创建一个Java类并从中扩展它 CoordinatorLayout.Behavior

    将粘贴代码从默认BottomSheetBehavior文件复制到新文件.

    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 ? low : (amount > high ? high : amount);
    }
    

    添加新状态:

    public static final int STATE_ANCHOR_POINT = X;
    

    修改下一个方法:onLayoutChild,onStopNestedScroll,BottomSheetBehavior from(V view)setState(可选)

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

以下是它的外观:
[CustomBottomSheetBehavior]

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有