如果由android设置,则getWidth()返回0:layout_width =“match_parent”

时间:2013-01-29 21:48:24

标签: android android-layout

我有一个名为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()在绘制之后返回图像的大小,而我实际需要的是此视图可用区域的宽度,之前我开始绘制。

有没有办法检索宽度和高度的这些值?

2 个答案:

答案 0 :(得分:30)

视图的大小在onMeasure()之后才可用,特别是如果设置为wrap_contentfill_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();
    [...]
}

这将返回正确的尺寸。