我有一个名为FractalView的类,它扩展了ImageView。我的目标是用这个具有整个屏幕大小的类来绘制分形。它是我活动的布局文件中唯一的视图,而不是顶级的LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFFFF">
<com.antonc.fractal_wallpaper.FractalView
android:id="@+id/fractal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
</LinearLayout>
如您所见,我对FractalView和LinearLayout的layout_width和layout_height都使用“match_parent”。此时我假设FractalView的大小设置为某个值,因为它匹配它的父级,它匹配它的父级(这是整个屏幕)。 然后我尝试使用getWidth()和getHeight()来检测FractalView可用的大小:
public class FractalView extends ImageView {
private Context mContext;
private Handler mHandler;
private int mScrWidth;
private int mScrHeight;
public FractalView(Context context) {
super(context);
mContext = context;
init();
}
private void init() {
mScrWidth = getWidth();
mScrHeight = getHeight();
// Breakpoint
}
@Override
protected void onDraw(Canvas canvas) {
[...]
}
}
但是当我的代码到达断点时,调试器显示mScrWidth和mScrHeight为零。我尝试过使用getMeasuredWidth()和getMaxWidth(),但它们也返回了不正确的值。我已经阅读了类似问题的几个答案,即this one,他们都解释了getWidth()在绘制之后返回图像的大小,而我实际需要的是此视图可用区域的宽度,之前我开始绘制。
有没有办法检索宽度和高度的这些值?
答案 0 :(得分:30)
视图的大小在onMeasure()
之后才可用,特别是如果设置为wrap_content
或fill_parent
。
您应该在View代码中的onMeasure()
中或之后,或在布局树观察器中访问大小:
LinearLayout layout = (LinearLayout)findViewById(R.id.mylayout);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int width = layout.getMeasuredWidth();
int height = layout.getMeasuredHeight();
}
});
您还需要将android:id="@+id/mylayout"
添加到LinearLayout,以便第二个工作。
答案 1 :(得分:0)
在我输入问题时,我想出了一种方法。
我没有尝试在构造函数方法中检索大小,而是将代码移动到onDraw()
方法,如下所示:
private void init() {
}
@Override
protected void onDraw(Canvas canvas) {
mScrWidth = canvas.getWidth();
mScrHeight = canvas.getHeight();
[...]
}
这将返回正确的尺寸。