在绘图程序中宽度和高度可以为零吗?

时间:2012-03-14 10:40:32

标签: android android-layout

今天我收到了崩溃报告,因为以下代码段w和/或h为零。我在自定义dispatchDraw上覆盖ViewGroup,在绘制子项后绘制叠加层:

@Override
public void dispatchDraw(Canvas canvas) {
  super.dispatchDraw(canvas);
  int w = getWidth();
  int h = getHeight();
  bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
  // ...
}

我仔细阅读documentation并且老实说无法理解为什么我应该打扰视图大小,因为当系统请求绘图时,所有视图必须已经布局(并且它不会如果大小为零则绘制视图的意义)。此外,这个错误很难追踪,因为我无法重现它,因为我只有超过20万次下载的2个崩溃报告。怎么了,怎么才能恢复呢?

阅读本文我知道问题是widht和height是0.问题是为什么它们在树布局后为零。每个绘图代码都需要原始信息,如宽度和高度,所以每次覆盖onDrawdispatchDraw时,我必须检查它们是否为非零。这应该由系统处理,并且大部分时间都是因为我从来没有能够重现这个错误并且只有两个崩溃报告

2 个答案:

答案 0 :(得分:0)

如果宽度或高度Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)会抛出IllegalArgumentException
在这里阅读:http://developer.android.com/reference/android/graphics/Bitmap.html#createBitmap%28int,%20int,%20android.graphics.Bitmap.Config%29
您必须使用try{}catch(){}声明

答案 1 :(得分:0)

显然他们可以。宽度或高度没有安全防护等于零。因此,当使用它们计算要绘制的坐标时,必须注意并检查有效尺寸。

实际上,由于宽度/高度等于零的视图实际上没有显示任何内容的空间,我使用这段简单的代码跳过绘图例程

@Override
public void onDraw(Canvas canvas)
  if (getWidth() == 0 || getHeight() == 0)
    return;
  // rest of the code...