我正在编写一个直接在View的onDraw事件上绘制到画布上的android应用程序.
我正在绘制涉及分别绘制每个像素的对象,为此,我使用类似以下内容:
for (int x = 0; x < xMax; x++) {
for (int y = 0; y < yMax; y++){
MyColour = CalculateMyPoint(x, y);
canvas.drawPoint(x, y, MyColour);
}
}
这里的问题是,这需要花费很长时间来绘制,因为CalculateMyPoint例程是一种非常昂贵的方法.
有没有一种更有效的向画布绘画的方法,例如,我应该绘制到位图,然后在onDraw事件上将整个位图绘制到画布?或者评估我的颜色并填写onDraw方法可用于绘制画布的数组?
我的应用程序的用户将能够更改影响画布上绘图的参数.目前,这非常慢.
解决方法:
正如人们指出的那样,如果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(尽管以较低的分辨率).