前言
不久前,我阅读了一篇有关“ 底表”的文章,在与同事协商之后,我决定在我们的应用程序中实现此功能。 在花了足够的时间教“底页”如何逐步旅行(例如Google地图)之后,我意识到了它的乏味和局限性。 找到了两种解决方案:将所有内容包装在将实时监视拉长窗帘状态的流中,或者重写BottomSheetBehavior类的某些方法(很幸运,Apache 2.0许可证允许您执行此操作)。 我选择了第二个选项,因为它对我来说似乎更可行,现在,根据我的经验,我将尝试告诉您它的结果。 我希望这对某人有用。 好吧,让我们开始吧。
客制化
我跳过了创建项目,向其中添加Google底表的步骤,因为如果您阅读此书,那么您已经克服了以上所有问题。 我们将需要转到BottomSheetBehavior类并将其内容复制到我们创建的新的CustomBottomSheetBehavior类中。 复制后,不要忘了重命名以红色标记的所有内容。 另外,在BottomSheet的.xml文件中,我们应该重命名这一行,以引用我们的新类,结果应该是这样的:
app:layout_behavior="com.my.custombottomsheetexample.CustomBottomSheetBehavior"
因此,我们有700多行看起来很吓人的Java代码,那么您如何处理它们?
首先,您需要找到onViewReleased()方法:
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) { ... }
我们只需要更改几行。 我们找到第一个if {...}并将其内容替换为以下代码:
if (yvel < 0.0F) { currentTop = releasedChild.getTop(); if (currentTop > CustomBottomSheetBehavior.this.halfExpandedOffset) { top = CustomBottomSheetBehavior.this.halfExpandedOffset; targetState = 6; } else { top = 0; targetState = 3; } }
现在,我们的BottomSheet分两个阶段进行,在中间停止:
(
)
高度变化
但这还不是全部,您可以调整平均高度。 为此,请在同一类中找到变量halfExpandedOffset的初始化:
this.halfExpandedOffset = this.parentHeight / 2;
当看这条线时,很明显,我们可以随意调整高度,即使是百分比也是如此。 我个人更喜欢这样更改:
this.halfExpandedOffset = this.parentHeight * 60 / 100;
(
)
我的BottomSheet延伸了主视图高度的40%。 仅此而已!