0

我有一个view1像这样扩展 FrameLayout 并覆盖 onMeasure() 的视图,因此它呈现为正方形:

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

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

我如何实现这一目标?

4

2 回答 2

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

在子类视图 1 的 View2 构造函数中:

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

然后,您可以使用视图 2 的正常布局重量和高度来分配其首选尺寸。

于 2016-03-07T02:51:20.030 回答
1

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

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

做你想做的事的一种方法——view2扩展了view1,但现在我希望view2的高度等于父级,因此覆盖整个屏幕——也是像这样覆盖调用setDimension的view2的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 中复制了您的代码)。

使用正方形: 在此处输入图像描述

对于 Squre2:

在此处输入图像描述

希望这可以帮助。

于 2016-03-07T03:05:23.840 回答