创建具有最小高度的自定义AppBarLayout子项?

时间:2017-01-03 08:09:44

标签: android android-coordinatorlayout android-appbarlayout

我想创建一个自定义视图,它将是AppBarLayout的子视图。当我向上滚动时,我需要此视图部分折叠,但不完全。它将具有最小高度并在其小尺寸模式下保持固定在AppBarLayout的顶部,然后在向下滚动视图时展开回到它的大尺寸模式。

我花了很多时间浏览AppBarLayout和CoordinatorLayout的来源,到目前为止,我还没有找到一种方法来做我想要的事情。看起来AppBarLayout的子项必须保持可见或在视图向上滚动时完全消失。

任何人都可以建议一种创建AppBarLayout子项的方法吗?

谢谢

1 个答案:

答案 0 :(得分:3)

这是食谱:

如果您设置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">

接下来,您希望您的班级与父OnOffsetChangedListener注册AppBarLayout。您的组件将在滚动应用栏时获取事件,以便您知道如何配置视图。

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);
        }

看看source code for CollapsingToolbarLayout因为它会给你一些想法。你的观点需要做很多相同的事情。

您还可以查看我的示例项目,该项目具有可在滚动工具栏时缩放和移动的图像:https://github.com/klarson2/Collapsing-Image