如何以编程方式创建自定义LinearLayout,其中高度是宽度的一定百分比?

时间:2014-07-15 03:08:45

标签: android android-layout android-linearlayout

我正在尝试创建一个自定义LinearLayout,其中高度为宽度的80%。

我创建了一个扩展LinearLayout并覆盖onMeasure()的类。我以为我可以操纵传入的widthMeasureSpec和heightMeasureSpec,但我得到的只是一个没有高度的LinearLayout。

实际上,我有一个TextView,所以我看到的是没有应用于布局的其他高度的TextView。

我希望有人可以告诉我这有什么问题:

public class CustomLinearLayout extends LinearLayout {

    public CustomLinearLayout(Context context) {

        super(context);
    }

    public CustomLinearLayout(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);
    }

    public CustomLinearLayout(Context context, AttributeSet attrs) {

        super(context, attrs);
    }

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

        int adjustedHeight = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.8); 
        int measureSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int adjustedHeightMeasureSpec = 
            MeasureSpec.makeMeasureSpec(adjustedHeight, measureSpecMode);

        super.onMeasure(widthMeasureSpec, adjustedHeightMeasureSpec);           
    }    
}
编辑:好的,这很奇怪。在我重新启动Eclipse并再次运行它之后,代码决定工作。

4 个答案:

答案 0 :(得分:1)

您应该准确地更改模式,例如:

int measureSpecMode = MeasureSpec.EXACTLY;

答案 1 :(得分:0)

一个问题可能是布局计算的高度是基于孩子的,即布局会越高,它就越多。

然而,您的代码的一个明显问题是您没有调用

setMeasuredDimension(widthMeasureSpec, adjustedHeightMeasureSpec);
onMeasure()方法中的

。你仍然有super.onMeasure。为了使用您自定义的测量高度和宽度,您必须调用此方法。实际上,您可以在onMeasure中删除代码的最后一行,并将其替换为上面的行。

答案 2 :(得分:0)

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

   super.onMeasure(widthMeasureSpec, (int)(widthMeasureSpec*0.8));           
} 

答案 3 :(得分:0)

您可以使用此代码将布局高度调整为任何比例:

private static final float RATIO = 80f / 100f;

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);

    int width = getMeasuredWidth();
    int height = getMeasuredHeight();
    int widthWithoutPadding = width - getPaddingLeft() - getPaddingRight();
    int heigthWithoutPadding = height - getPaddingTop() - getPaddingBottom();

    int maxWidth = (int) (heigthWithoutPadding * RATIO);
    int maxHeight = (int) (widthWithoutPadding / RATIO);

    if (widthWithoutPadding > maxWidth) {
        width = maxWidth + getPaddingLeft() + getPaddingRight();
    } else {
        height = maxHeight + getPaddingTop() + getPaddingBottom();
    }

    setMeasuredDimension(width, height);
    super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));

}

您可以根据需要改变RATIO常数。