画到canvas上

我正在编写一个Android应用程序,它直接在View的onDraw事件上绘制到canvas。

我正在绘制一些涉及单独绘制每个像素的东西,为此我使用如下内容:

for (int x = 0; x < xMax; x++) { for (int y = 0; y < yMax; y++){ MyColour = CalculateMyPoint(x, y); canvas.drawPoint(x, y, MyColour); } } 

这里的问题是这需要很长时间来绘制,因为CalculateMyPoint例程是一种非常昂贵的方法。

是否有更有效的绘制到canvas的方法,例如我应该绘制一个位图,然后将整个位图绘制到onDraw事件的canvas上? 或者可以评估我的颜色并填写onDraw方法可用于绘制canvas的数组?

我的应用程序的用户将能够更改影响canvas上绘图的参数。 这一刻非常缓慢。

正如人们所指出的那样,如果CalculateMyPixel()价格昂贵,那么称为150,000(HVGA)或384,00倍(WVGA)只会让你失望。

最重要的是,每次有更新时,尝试通过canvas.drawPoint()将UI绘制为单个像素,这是执行此操作的最低效方法。

如果您要绘制单个像素,您几乎肯定想要某种包含像素的离屏位图,您可以使用简单的Canvas.drawBitmap()绘制。

然后,您可以决定管理该位图的最佳方法。 最简单的方法是只创建一个所需大小的Bitmap对象,并使用那里的API来填充它。

或者,有一个drawBitmap()版本采用原始整数数组,因此您可以使用您想要的任何值直接填充它,从而避免对每个像素进行方法调用。

现在,您可以将像素计算移出onDraw()方法,该方法需要快速获得响应式UI,并在其他位置填充像素。 也许你在初始化时计算它们一次。 也许你计算它们,并且在调用invalidate()之前只对已经改变的部分进行选择性更新(例如,来自(0,0) – (10,l0)的像素已经改变,所以获取当前位图并只修改该区域)。 如果计算像素实际上只是本质上很慢,你可能想要创建一个单独的线程来完成这项工作(使用新像素更新位图,然后在UI上使用postInvalidate()来绘制它们)。

现在您已经在位图中使用了像素,您可以做一些技巧,例如缩小位图的大小并在绘制到屏幕时缩放它,这样可以在更新这些像素时花费更少的时间,同时仍然可以填充整个UI(尽管如此)在较低的分辨率)。