扩展覆盖 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:
希望对您有所帮助。
我有一个视图 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:
希望对您有所帮助。