2010-03-21 113 views
3

我正在写一个直接绘制到视图的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方法可用于绘制画布的数组?

我的应用程序的用户将能够更改影响画布上绘图的参数。这在目前非常缓慢。

+0

什么使CalculateMyPoint需要很长时间才能处理? – Adam 2010-03-21 14:03:43

+0

我有一个合理的计算来计算任何给定像素的颜色。我只是想知道是否最好计算每个像素的颜色而不是视图的onDraw事件。 – Mattl 2010-03-21 17:30:30

+0

您是否必须单独绘制每个像素?因为Droid或nexus上的像素超过40万像素,我觉得有更多机会优化CalculateMyPoint的调用次数而不是运行时。 – jqpubliq 2010-03-21 17:54:11

回答

5

正如人们已经指出的那样,如果CalculateMyPixel()价格昂贵,那么称为150,000(HVGA)或384,00倍(WVGA)就是要杀死你。

最重要的是,每次有更新时都试图通过canvas.drawPoint()将您的用户界面作为单个像素绘制,而这只是最低效的方式。

如果你正在绘制单独的像素,你几乎肯定会想要一些包含像素的离屏位图,你可以用一个简单的Canvas.drawBitmap()来绘制。

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

或者,还有一个drawBitmap()的版本需要原始整数数组,因此您可以将其填充直接与你想要的任何值,避免每个像素的方法调用。

现在,您可以将像素计算移出onDraw()方法,该方法需要快速以获得响应式UI,并将像素填充到其他位置。也许你在初始化时计算一次。也许你计算它们,并且在调用invalidate()之前仅对已经改变的部分进行选择性更新(例如(0,0) - (10,l0)中的像素已经改变,因此取出当前位图并修改该区域)。如果计算像素真的很慢,那么您可能需要创建一个单独的线程来执行此操作(使用新像素更新位图,然后在UI上使用postInvalidate()来绘制它们)。

此外,现在您的像素位于一个位图中,您可以执行一些技巧,比如缩小位图的大小并在绘制到屏幕时对其进行缩放,从而使您在更新这些像素时花费更少的时间,整个用户界面(虽然分辨率较低)。

+0

谢谢,我想这是所有常识。
目前大约需要1分钟时间,我的OnDraw例程中用代码初始化应用程序,超过1秒的任何内容都可能无法接受。
此调用初始化我的位图的像素阵列我需要:
公共静态位图createBitmap(INT []的色彩,诠释宽度,高度INT,Bitmap.Config配置)
这也是事实,我真的不需要WVGA分辨率,所以我会尝试缩放。
Mattl 2010-03-22 12:06:44

+0

我在这个晚上度过了这些提示,并将我的渲染从一分钟缩短到了3秒!我想我可以通过进一步优化来削减另一秒。再次感谢hackbod。 – Mattl 2010-03-23 10:34:07

+1

你能举出一个改进代码的例子吗? – 2010-07-01 07:57:41