扩展覆盖 onMeasure() 的视图

Extending a view which overrides onMeasure()

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

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

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

如何实现?

在视图 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 的正常布局重量和高度来分配其首选尺寸。

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

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

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

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:

希望对您有所帮助。