创建一个具有最小高度的自定义AppBarLayout子视图?

4
我想创建一个自定义视图,它将是AppBarLayout的子项。当我向上滚动时,我需要该视图部分折叠,但不完全折叠。它将具有最小高度,并在其小大小模式下固定到AppBarLayout的顶部,然后在向下滚动视图时扩展回其大大小模式。
我花了很多时间查看AppBarLayout和CoordinatorLayout的源代码,但目前还没有找到满足我的要求的方法。似乎AppBarLayout的子项必须在向上滚动视图时保持可见或完全消失。
请问有人能建议一种创建AppBarLayout子项并以这种方式进行操作的方法吗?
谢谢。
1个回答

4
这里是配方:
如果您设置了android:minHeight,则AppBarLayout将尊重该值,不会滚动超出使您的组件变小的点。 因此,您的XML布局可能如下所示:
    <com.example.CustomCollapsingLayout
        android:layout_width="match_parent"
        android:layout_height="320dp"
        android:minHeight="108dp"
        android:fitsSystemWindows="true"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

接下来,你需要让你的类在父级AppBarLayout上注册一个OnOffsetChangedListener。随着应用栏的滚动,你的组件将会接收到事件,以便你知道如何配置你的视图。

class OnOffsetChangedListener implements AppBarLayout.OnOffsetChangedListener {

        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {

            final int scrollRange = appBarLayout.getTotalScrollRange();
            float offsetFactor = (float) (-verticalOffset) / (float) scrollRange;
            ...

本文将向您展示如何查找总滚动范围,然后找到总滚动范围与当前滚动位置之间的比率,即应用栏在其滚动中的位置。

您应该像CollapsingToolbarLayout一样做;重写onAttachedToWindow并在那里添加监听器:

        // Add an OnOffsetChangedListener if possible
        final ViewParent parent = getParent();
        if (parent instanceof AppBarLayout) {
            if (mOnOffsetChangedListener == null) {
                mOnOffsetChangedListener = new OnOffsetChangedListener();
            }
            ((AppBarLayout) parent).addOnOffsetChangedListener(mOnOffsetChangedListener);
        }

请查看CollapsingToolbarLayout的源代码,它会给你一些想法。您的视图需要做很多相同的事情。
您还可以查看我的示例项目,其中包含一个随着工具栏滚动而缩放和移动的图像:https://github.com/klarson2/Collapsing-Image

可以了,谢谢。我之前也看过exitUntilCollapsed,但是理解有误。 - HansG600
你是一个救星。 - Artem M

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