【问题标题】:Android Canvas -- Draw a Rectangle or a Picture of a RectangleAndroid Canvas -- 绘制矩形或矩形的图片
【发布时间】:2012-07-06 15:30:32
【问题描述】:

如果您总是要绘制同一个矩形,使用静态位图或使用 canvas.drawRect() 会更快吗?

对于这个例子,是四个分层的矩形。所以一个带有填充颜色的边界,然后是中间颜色和填充颜色之间的边界。

所以四个paint.setColor() 命令和四个canvas.drawRect 命令或一个canvas.drawBitmap()。

【问题讨论】:

  • 如果你计时,不要用paint.setColor();你不应该在绘图程序中改变你的油漆,你应该有四个油漆。对每个矩形使用每个。或者,如果您绘制相同的颜色,则可以重复使用它们。

标签: android performance canvas


【解决方案1】:

我强烈推荐drawRect()

位图占用大量内存,如果使用不当会导致Out Of Memory 异常。

由安卓编写:

位图会占用大量内存,尤其是对于照片等丰富的图像。例如,Galaxy Nexus 上的相机可拍摄高达 2592x1936 像素(5 兆像素)的照片。如果使用的位图配置是 ARGB_8888(从 Android 2.3 开始的默认配置),则将此图像加载到内存中大约需要 19MB 内存(2592*1936*4 字节),立即耗尽某些设备上的每个应用程序限制。

为了防止头痛和意外崩溃。使用drawRect();

如果您定期为不同的对象进行这 4 次绘制,请考虑编写一个为您完成所有 4 次绘制的方法。所以你不会造成大量重复。

例如:

public void DrawMyRect(Canvas canvas, int x, int y)
{
   canvas.drawRect(x, y ,x + 15, y + 40, paint);
   // Draw its line etc etc..
 }

或者,如果您确实要绘制位图,因为它确实有优势:

See this epic Link by Android, on how to properly use Bitmaps

【讨论】:

  • 这个怎么样:*.com/questions/5643151/… 我得到了不同的反应。而且我的图像足够小,我不应该有内存错误。我现在只关心性能。将有 6 张 32x32 图像。
  • 添加到我的答案中。如果您使用小图像,则应该没有问题。两者都不会明显提高性能。我在这里有一个应用程序,可以在不到一秒的时间内绘制数百条线条/形状等。如果您使用少量形状,我看不到任何性能问题。如果您使用位图,我建议您仍然按照链接进行操作,以确保您有效地进行操作。
  • @NathanTornquist。更不用说,位图的大小是固定的,所以如果你调整它的大小,它最终可能看起来更糟。 DrawRect 清晰明了,可以轻松更改而不会影响外观,以适应您的形状/需求。
  • 不会对位图产生任何影响。一切都是直接绘制的,没有缩放。
  • @NathanTornquist 然后选择其中一个。您需要它的规模不会导致任何性能损失或内存溢出。如果您正在查看 300x300 的图像,它们会耗尽您的记忆。然而,这种情况并非如此。因此,一种方法没有真正的缺点。但没有真正的收获,除非你说的代码行数更少。 :)
【解决方案2】:

性能差异可能可以忽略不计。位图将使用更多内存,画布绘制调用将使用稍微更多的 CPU。如果您想减少调用而不需要位图的开销,您可以使用ShapeDrawable

【讨论】: