Android 如何仅在内容占满屏幕高度时滚动,未占满高度时居中?

kmxz
  • 4.3k

如下图所示:

图1图2

Card content 中的内容数量不固定。Card header 和 Card footer 内容固定。

想要在内容较少而屏幕较高(图1)时,将内容全部显示,整个 Card 竖直居中于屏幕。

而内容较多而屏幕较小(图2),内容无法一屏显示完整时,让 Card 占满屏幕,而 Card content 部分利用 ScrollView 来显示内容。

有没有什么优雅简洁的方法可以做到?如果要自己实现一个 View 来做到的话,有什么大致的思路可供参考吗?

谢谢。

回复
阅读 3.2k
2 个回答
✓ 已被采纳

Mariotaku 大神已经帮我解决了这个问题。根据他写的思路我整理了一下:

首先我把一个撑满整个屏幕的 RelativeLayout 的 gravity 设为 center,然后整个 card 放在里面自然居中。Card 里面放三个 View,分别是 header,中间的 ScrollView 和 footer。

Card 部分自己实现,且称之为 CardLayout:

class CardLayout extends ViewGroup {

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int w = MeasureSpec.getSize(widthMeasureSpec);
        int h = MeasureSpec.getSize(heightMeasureSpec);

        // measure 一下 card header
        measureChild(getChildAt(0), widthMeasureSpec, heightMeasureSpec);
        // measure 一下 card footer
        measureChild(getChildAt(2), widthMeasureSpec, heightMeasureSpec);

        // 计算 card content 部分最大可占用的高度
        int cardMaxHeight = h - getChildAt(0).getMeasuredHeight() - getChildAt(2).getMeasuredHeight();

        // measure 一下 card content
        measureChild(getChildAt(1), getChildMeasureSpec(widthMeasureSpec, 0, w), getChildMeasureSpec(MeasureSpec.makeMeasureSpec(cardMaxHeight, MeasureSpec.AT_MOST), 0, cardMaxHeight));

        // 整个 card 的高度
        setMeasuredDimension(w, getChildAt(0).getMeasuredHeight() + getChildAt(1).getMeasuredHeight() + getChildAt(2).getMeasuredHeight());

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // 将三个 child 分别 layout
        getChildAt(0).layout(0, 0, getChildAt(0).getMeasuredWidth(), getChildAt(0).getMeasuredHeight());
        getChildAt(1).layout(0, getChildAt(0).getBottom(), getChildAt(1).getMeasuredWidth(), getChildAt(0).getBottom() + getChildAt(1).getMeasuredHeight());
        getChildAt(2).layout(0, getChildAt(1).getBottom(), getChildAt(2).getMeasuredWidth(), getChildAt(1).getBottom() + getChildAt(2).getMeasuredHeight());
    }
        
}

厉害,过来膜拜一下了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏