像谷歌地图一样滑动BottomSheet

2023-11-24

目前我正在使用来自this lib,我想实现这样的图像动画谷歌地图在滑动底页时,我想按照所示的图像一起滑动图像视图, 我已经用过这个了帮助链接但没有得到。 我已经尝试了很多时间,但找不到任何解决方案,任何帮助都可以。 提前致谢..


你能行的修改默认Behavior用于 BottomSheet、ImageView、ToolBars 和 FAB。

首先,您需要向 BottomSheetBehavior 添加一个状态。您可以按照以下步骤进行操作:

  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 ? low : (amount > high ? high : amount);
    }
    
  4. 添加新状态

    public static final int STATE_ANCHOR_POINT = X;
    
  5. 修改以下方法:onLayoutChild, onStopNestedScroll, BottomSheetBehavior<V> from(V view) and setState(选修的)



我将添加这些修改后的方法和链接到示例项目您可以在其中看到所有自定义行为

public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
    // First let the parent lay it out
    if (mState != STATE_DRAGGING && mState != STATE_SETTLING) {
        if (ViewCompat.getFitsSystemWindows(parent) &&
                !ViewCompat.getFitsSystemWindows(child)) {
            ViewCompat.setFitsSystemWindows(child, true);
        }
        parent.onLayoutChild(child, layoutDirection);
    }
    // Offset the bottom sheet
    mParentHeight = parent.getHeight();
    mMinOffset = Math.max(0, mParentHeight - child.getHeight());
    mMaxOffset = Math.max(mParentHeight - mPeekHeight, mMinOffset);

    //if (mState == STATE_EXPANDED) {
    //    ViewCompat.offsetTopAndBottom(child, mMinOffset);
    //} else if (mHideable && mState == STATE_HIDDEN...
    if (mState == STATE_ANCHOR_POINT) {
        ViewCompat.offsetTopAndBottom(child, mAnchorPoint);
    } else if (mState == STATE_EXPANDED) {
        ViewCompat.offsetTopAndBottom(child, mMinOffset);
    } else if (mHideable && mState == STATE_HIDDEN) {
        ViewCompat.offsetTopAndBottom(child, mParentHeight);
    } else if (mState == STATE_COLLAPSED) {
        ViewCompat.offsetTopAndBottom(child, mMaxOffset);
    }
    if (mViewDragHelper == null) {
        mViewDragHelper = ViewDragHelper.create(parent, mDragCallback);
    }
    mViewRef = new WeakReference<>(child);
    mNestedScrollingChildRef = new WeakReference<>(findScrollingChild(child));
    return true;
}


public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
    if (child.getTop() == mMinOffset) {
        setStateInternal(STATE_EXPANDED);
        return;
    }
    if (target != mNestedScrollingChildRef.get() || !mNestedScrolled) {
        return;
    }
    int top;
    int targetState;
    if (mLastNestedScrollDy > 0) {
        //top = mMinOffset;
        //targetState = STATE_EXPANDED;
        int currentTop = child.getTop();
        if (currentTop > mAnchorPoint) {
            top = mAnchorPoint;
            targetState = STATE_ANCHOR_POINT;
        }
        else {
            top = mMinOffset;
            targetState = STATE_EXPANDED;
        }
    } else if (mHideable && shouldHide(child, getYVelocity())) {
        top = mParentHeight;
        targetState = STATE_HIDDEN;
    } else if (mLastNestedScrollDy == 0) {
        int currentTop = child.getTop();
        if (Math.abs(currentTop - mMinOffset) < Math.abs(currentTop - mMaxOffset)) {
            top = mMinOffset;
            targetState = STATE_EXPANDED;
        } else {
            top = mMaxOffset;
            targetState = STATE_COLLAPSED;
        }
    } else {
        //top = mMaxOffset;
        //targetState = STATE_COLLAPSED;
        int currentTop = child.getTop();
        if (currentTop > mAnchorPoint) {
            top = mMaxOffset;
            targetState = STATE_COLLAPSED;
        }
        else {
            top = mAnchorPoint;
            targetState = STATE_ANCHOR_POINT;
        }
    }
    if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
        setStateInternal(STATE_SETTLING);
        ViewCompat.postOnAnimation(child, new SettleRunnable(child, targetState));
    } else {
        setStateInternal(targetState);
    }
    mNestedScrolled = false;
}

public final void setState(@State int state) {
    if (state == mState) {
        return;
    }
    if (mViewRef == null) {
        // The view is not laid out yet; modify mState and let onLayoutChild handle it later
        /**
         * New behavior (added: state == STATE_ANCHOR_POINT ||)
         */
        if (state == STATE_COLLAPSED || state == STATE_EXPANDED ||
                state == STATE_ANCHOR_POINT ||
                (mHideable && state == STATE_HIDDEN)) {
            mState = state;
        }
        return;
    }
    V child = mViewRef.get();
    if (child == null) {
        return;
    }
    int top;
    if (state == STATE_COLLAPSED) {
        top = mMaxOffset;
    } else if (state == STATE_ANCHOR_POINT) {
        top = mAnchorPoint;
    } else if (state == STATE_EXPANDED) {
        top = mMinOffset;
    } else if (mHideable && state == STATE_HIDDEN) {
        top = mParentHeight;
    } else {
        throw new IllegalArgumentException("Illegal state argument: " + state);
    }
    setStateInternal(STATE_SETTLING);
    if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
        ViewCompat.postOnAnimation(child, new SettleRunnable(child, state));
    }
}


public static <V extends View> BottomSheetBehaviorGoogleMapsLike<V> from(V view) {
    ViewGroup.LayoutParams params = view.getLayoutParams();
    if (!(params instanceof CoordinatorLayout.LayoutParams)) {
        throw new IllegalArgumentException("The view is not a child of CoordinatorLayout");
    }
    CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params)
            .getBehavior();
    if (!(behavior instanceof BottomSheetBehaviorGoogleMapsLike)) {
        throw new IllegalArgumentException(
                "The view is not associated with BottomSheetBehaviorGoogleMapsLike");
    }
    return (BottomSheetBehaviorGoogleMapsLike<V>) behavior;
}



您甚至可以使用回调behavior.setBottomSheetCallback(new BottomSheetBehaviorGoogleMapsLike.BottomSheetCallback() {....

And here is how its looks like:
CustomBottomSheetBehavior

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

像谷歌地图一样滑动BottomSheet 的相关文章

  • Android 主机意图过滤器通配符

    是否可以在 android host 属性上使用通配符 就像是 android host site com android pathPattern android pathPrefix m android scheme http gt Or
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • 显示警报或收到通知时的视图

    我正在关注this http tokudu com 2010 how to implement push notifications for android 显示的教程通知 on an 安卓设备 当我在设备上运行该应用程序时 状态栏上会出现
  • 如何在出现“无法解析放置符号”错误时向哈希图添加键和值

    我正在与安卓工作室 https en wikipedia org wiki Android Studio1 4 1 我刚刚创建了一个 Hashmap 并正在遵循有关如何填充和操作它的教程 Java 语言 但是 我收到 无法解析符号放置 错误
  • 应用程序实例是否始终在任何活动之前创建?

    在 Android 中 您可以通过扩展 Application 类并在 Manifest 中声明名称来提供您自己的 Application 类实现 我的问题是 这个实现是否总是在初始活动之前创建 或者活动可以在应用程序实例有时间创建之前启动
  • 为什么我将可绘制文件重命名为 .9.png 后出现“Some file crunching failed”?

    我正在测试 9 patch 图像 在一切正常之前 我重命名drawable file ic button beat box default png to ic button beat box default 9 png 然后我收到错误 某些
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • Google Firebase - 如何删除崩溃报告?

    我最终失明了吗 还是没有明显的方法可以通过 Google Firebase Web 控制台删除 Firebase 崩溃报告 我的 Android 应用程序已成功记录报告 但现在出现大量 开发崩溃 占用了我在控制台中的大部分视图 这使得找到实
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • 如何使用闹钟音量和 setAudioAttributes 来播放铃声?

    所以我正在尝试了解音频属性 这是我到目前为止所拥有的 alarm getSound will return a proper URI to pick a ringtone Ringtone tone RingtoneManager getR
  • React Native Android 发布 apk 是调试,而不是发布

    我有一个现有的 Android 应用程序 我已根据以下内容将 React Native v0 30 活动添加到项目中docs http facebook github io react native releases next docs i
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • AnalyticsService 未在应用程序清单中注册 - 错误

    我正在尝试使用 sdk 中提供的以下文档向 Android 应用程序实施谷歌分析服务 https developers google com analytics devguides collection android v4 https d
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • 检测 ListView(或 ScrollView)内的滚动位置

    我正在构建一个聊天室应用程序 其中每 X 秒就会轮询一次新事件 每次发生这种情况时 此代码都会使用新数据更新 RoomAdapter ArrayAdapter 的自定义子类 并将其滚动到底部 RoomAdapter adapter Room
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0

随机推荐

  • 为什么不能将受约束的开放泛型类型转换为受约束类型?

    我想我一定错过了一些东西 为什么我不能编译这个 class Foo
  • 如何在Android中的ListView中显示图像列表?

    如何使用 ListView 显示图像列表 我正在运行时下载图像 图像总数不固定 我会从这样的事情开始 如果我的代码有问题 我当然会感谢任何评论 public class ItemsList extends ListActivity priv
  • 在带有 Java/JDBC 的 Oracle PL/SQL 中使用游标并获取结果

    我有一个像这样构建的 PL SQL 查询 DECLARE a NUMBER B NUMBER CURSOR cursor IS SOME SELECT QUERY BEGIN OPEN cursor LOOP SOME STUFF END
  • angularjs ui-router stateparams 在页面刷新时不可见丢失

    我正在开发一个有角度的项目 我在其中设置了状态 如下所示 stateProvider state UserPanel url user params userId null views content templateUrl AngView
  • Java JIT 编译器导致 OutOfMemoryError

    我们最近开始偶尔崩溃的一个应用程序 并显示一条有关 java lang OutOfMemoryError 为 Chunk new 请求 8589934608 字节 交换空间不足 的消息 我在网上环顾四周 到处的建议都仅限于 恢复到以前的 J
  • JPA 2 和 Hibernate 3.5.1 MEMBER OF 查询不起作用

    我正在尝试以下 JPQL 但它失败了 Query query em createQuery SELECT u FROM User u WHERE admin MEMBER OF u roles List users query query
  • 从 NFC 标签读取数据

    您好 我正在开发一个用于向 NFC 标签读取和写入数据的应用程序 我在从 NFC 标签读取数据时遇到问题 当我尝试读取数据时 我的应用程序第一次崩溃 当我第二次扫描标签时 应用程序读取数据时再次崩溃 请帮我解决这个问题 这是我的代码 提前致
  • 我可以将一个查询拆分为多个查询或创建并行性来加速查询吗?

    我有一张桌子avl pool 我有一个函数可以在地图上找到最接近该链接的链接 x y 位置 此选择的性能非常线性 该函数需要约 8 毫秒才能执行 所以计算一下这个 select 1000 行需要 8 秒 或者正如我在此示例中所示 20 00
  • 抛出格式异常 C#

    我试图在有人在提示输入年龄时尝试输入非整数字符的实例中抛出格式异常 Console WriteLine Your age age Int32 Parse Console ReadLine 我不熟悉 C 语言 可以使用帮助来为此实例编写 tr
  • 反编译APK,修改它然后重新编译它

    我需要修改现有的 APK 修改源代码 然后重新编译它 我可以使用 dex2jar 或 apktool 反编译它 效果很好 从jar文件中我可以获得java源代码 使用jd gui 然后我可以修改java文件 但现在我想知道如何重新编译jav
  • StartCoroutine/yield 返回模式在 Unity 中到底如何工作?

    我了解了协程的原理 我知道如何达到标准StartCoroutine yield return在 Unity 中的 C 中工作的模式 例如调用一个方法返回IEnumerator via StartCoroutine并在该方法中做某事 做yie
  • Enum 类型属性的 RestSharp 反序列化

    我有一个对象 var testTcc new TrendingConfigurationConfigDto TrendingConfigurationId 1 ConfigId 1 DeviceId 1 Selected true YAxi
  • 手动安装 NPM 包

    我使用node windows installer v0 8 3来安装nodejs 当我尝试像这样安装express时 npm install express 它不起作用 我认为这是因为我的公司使用了代理 所以我从github下载了expr
  • 本机库加载时出现莫名其妙的 UnsatisfiedLinkError

    首先 也是最重要的 我的申请一般有效 我在所有四个 32 位 CPU ABI 上有许多客户端 并且他们运行该应用程序没有任何问题 本机库是为所有四种架构构建的 库就在那里 方法都就位并且命名正确 然而 我偶尔会收到无法加载本机库的异常报告
  • 如何从 pdf 文件中提取附件?

    我有大量 pdf 文档 其中附有 xml 文件 我想提取那些附加的 xml 文件并读取它们 如何使用 net 以编程方式执行此操作 iTextSharp 也非常有能力提取附件 尽管您可能必须使用低级对象来执行此操作 有两种方法可以在 PDF
  • GDB 警告:在 0x7ffff7ffd000 处添加的符号文件系统提供的 DSO 中未找到可加载部分

    abijith bufferOverFlow gdb a out GNU gdb GDB 7 6 Copyright C 2013 Free Software Foundation Inc License GPLv3 GNU GPL ver
  • PHP向多维数组的每个子数组添加元素

    我有一个看起来像这样的数组 array 0 gt array id gt 1 title gt title 1 1 gt array id gt 10 title gt title 10 2 gt array id gt 11 title
  • 简单的 nginx 反向代理似乎会删除一些标头

    我是 nginx 的初学者 我在 8080 上有一个简单的网络服务器 我想在这个相当小的环境中将所有流量传递到它 我的代理似乎可以工作 只是当它到达我的上游服务器时 自定义标头不存在 服务器块如下 我需要添加什么来保留我的自定义标头 在这种
  • IOS共享扩展:如何从笔记帖子中读取内容

    我希望我的应用程序能够解析笔记应用程序帖子以及其他文本编辑器帖子中的文本 因此我创建了一个共享扩展目标 一切工作正常 直到我准备应用程序发布 替换TRUEPREDICATE经过 NSExtensionActivationRule 据说 在我
  • 像谷歌地图一样滑动BottomSheet

    目前我正在使用来自this lib 我想实现这样的图像动画谷歌地图在滑动底页时 我想按照所示的图像一起滑动图像视图 我已经用过这个了帮助链接但没有得到 我已经尝试了很多时间 但找不到任何解决方案 任何帮助都可以 提前致谢 你能行的修改默认B