2

我想创建一个 custom View,这样当它作为一个维度参数膨胀时,wrap_content作为另一个维度参数match_parent,它将具有恒定的纵横比,填充设置为的任何维度match_parent,但提供具有另一个维度的布局充气器被“包裹”。我认为这是可能的,因为例如,全屏宽度TextView显然能够要求它有空间容纳两、三或任意数量的文本行(取决于宽度),但在通货膨胀之前不一定知道这一点-时间。

理想情况下,我想做的是覆盖View子类中的布局方法,这样当视图膨胀时,我得到布局信息,并为要包装的“内容”提供我自己的尺寸(即我的固定比例矩形)。

我需要创建很多这样的自定义视图,并将它们放在各种不同类型的布局中——有时使用一个——Adapter所以我真的想尽可能地控制它们的膨胀。这样做的最佳技术是什么?

4

2 回答 2

1

您始终可以在 onMeasure 中检查是否符合纵横比。

我知道不是一个完整的答案,但它应该引导你到那里;)

于 2012-05-23T10:59:48.237 回答
0

我现在用下面的代码解决了这个问题。值得一提的是,我要覆盖的类是具有自ViewGroup定义子项的自定义,全部使用继承的onMeasure. 孩子是在构建时创建和添加的,我当然认为这是必要的。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    float width = MeasureSpec.getSize(widthMeasureSpec);
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);

    float height = MeasureSpec.getSize(heightMeasureSpec);
    final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

    float nominalHeight = getResources().getInteger(R.integer.nominalheight);
    float nominalWidth = getResources().getInteger(R.integer.nominalwidth);

    float aspectRatio = nominalWidth / nominalHeight;

    if( widthMode == MeasureSpec.UNSPECIFIED ) { //conform width to height
        width = height * aspectRatio;
    }
    else if (heightMode == MeasureSpec.UNSPECIFIED ) { //conform height to width
        height = width / aspectRatio;
    }
    else if( width / height > aspectRatio //too wide
            && ( widthMode == MeasureSpec.AT_MOST )
            ) { 
        width -= (width - height * aspectRatio);
    }
    else if( width / height < aspectRatio //too tall
            && ( heightMode == MeasureSpec.AT_MOST )
            ) { 
        height -= (height - width / aspectRatio);
    }

    int newWidthMeasure = MeasureSpec.makeMeasureSpec((int)width, MeasureSpec.AT_MOST);
    int newHeightMeasure = MeasureSpec.makeMeasureSpec((int)height, MeasureSpec.AT_MOST);
    measureChildren(newWidthMeasure, newHeightMeasure);

    setMeasuredDimension((int)width, (int)height);
}

我根据资源中的标称矩形来定义纵横比,但显然还有很多其他方法可以做到这一点。

感谢Josephus Villarey 首先指出我onMeasure(...)

于 2012-06-04T16:53:08.870 回答