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);--设置测量尺寸(宽度测量等级、高度测量等级);