Android 扩展覆盖onMeasure()的视图

Android 扩展覆盖onMeasure()的视图,android,view,onmeasure,Android,View,Onmeasure,我有一个视图view1,它像这样扩展FrameLayout并覆盖onMeasure(),因此它被渲染为正方形: @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } 现在我想创建另一个视图view2,它扩展了view1,但现在我想view2的高度等于父视图,

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

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
  }
现在我想创建另一个视图
view2
,它扩展了
view1
,但现在我想
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;
}
在View2中,子类化视图1的构造函数:

public View2(Context c) {
    setMeasureAsSquare(false);
}
然后,您可以使用视图2的正常布局重量和高度来指定其首选尺寸。

在视图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的正常布局重量和高度来指定其首选大小。

因为已覆盖了方形的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);
    }
}
这是我试用过的样品。(对于方形视图中的代码,我刚刚在onMeasure中复制了您的代码)

使用正方形:

对于Squre2:


希望这能有所帮助。

因为根据您的代码,正方形的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);
    }
}
这是我试用过的样品。(对于方形视图中的代码,我刚刚在onMeasure中复制了您的代码)

使用正方形:

对于Squre2:


希望这有帮助。

你让我开心!我想得太多了你让我开心!我想得太多了您似乎能够提供高度,而不仅仅是简单地使其等于父级,您只需更改--setMeasuredDimension(widthMeasureSpec,ViewGroup.LayoutParams.MATCH_parent);--设置测量尺寸(宽度测量等级、高度测量等级);您似乎能够提供高度,而不仅仅是简单地使其等于父级,您只需更改--setMeasuredDimension(widthMeasureSpec,ViewGroup.LayoutParams.MATCH_parent);--设置测量尺寸(宽度测量等级、高度测量等级);