扩展覆盖onMeasure()的视图

时间:2016-03-07 02:33:16

标签: android view onmeasure

我有一个视图view1,它扩展了FrameLayout并像这样重写onMeasure(),以便它呈现为正方形:

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

现在我想创建一个扩展view2的另一个视图view1,但现在我希望view2的高度等于父级,因此可以覆盖整个屏幕。截至目前,我也把它作为一个正方形。

我如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

在视图1中:

private boolean measureAsSquare = true;

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (measureAsSquare) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
    else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

public void setMeasureAsSquare(boolean b) {
    measureAsSquare = b;
}

在View2构造函数中继承视图1:

public View2(Context c) {
    setMeasureAsSquare(false);
}

然后,您可以使用视图2的正常布局权重和高度来指定其首选大小。

答案 1 :(得分:1)

由于 Square 的onMeasure已被覆盖,因此根据您的代码忽略传递给它的高度:

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

一种方法可以做你想要的 - view2扩展view1,但现在我希望view2的高度等于父级,因此覆盖整个屏幕 - 也是覆盖view2调用setDimension的 onMeasure ,就像这样...

public class Square2 extends Square {

    public Square2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

这是我试用后的样本。 (对于Square View中的代码,我只是在onMeasure中复制了代码。)

使用Square: enter image description here

对于Squre2:

enter image description here

希望这有帮助。