2012-03-08 58 views
0

我正在创建一个基于复杂数学表达式生成随机图像的Android应用程序。像素的颜色取决于其位置和所选表达式。 (我看到很多iPhone应用程序产生“随机艺术”,但是相对较少的Android应用程序)。如何使用SurfaceView绘制单个复杂图像

需要5到15秒才能在Nexus S dev手机上绘制图像。

为了保持UI线程的响应,这看起来像SurfaceView类的目的。几乎所有SurfaceView的例子都涉及动画,而不是一个复杂的图像。一旦图像完成绘制/渲染,我不会改变它,直到用户

因此,是SurfaceView正确的组件使用?如果是这样,当完成渲染完成后,是否可以从SurfaceView或其内部线程获取回调?回调是这样的,我知道用低分辨率图像艺术的低分辨率和块状版本切换可以吗?

是否有替代SurfaceView的更适合单张图像的复杂渲染。 (不是动画)

干杯!

+0

为什么不使用openGl? – slayton 2012-03-08 19:05:46

+0

在普通SurfaceView中使用openGL(我认为是GLSurfaceView)有什么优势? – 2012-03-08 19:11:35

+1

因为减速并非在渲染中,而是在计算中。将任意数学计算卸载到GLSL着色器语言是...挑战:)。使用NDK路线或使用RenderScript的Compute API可能是更好的选择。 – 2012-03-08 19:13:49

回答

1

如果您只想在另一个线程上渲染单个复杂图像以保持UI响应,那么在完成渲染之后实际绘制它,您可能会考虑在标准保持工作关闭 - 通过使用类似于AsyncTask的东西的UI线程方式。这不像你在做合成或任何真正与GPU相关的东西(除非其他人已经建议你可以将实际的渲染计算卸载到GPU上)。

我至少用简单的建立表示在AsyncTask那么当你做你的像素阵列实验,使用它创建使用setPixels位图和ImageView源设置为位图。

另一方面,如果您希望图像逐像素地出现,那么SurfaceView可能是一个合理的选择,在这种情况下,它基本上是一个动画,所以您可以按照其他教程。还有一些其他的设置,但主要是覆盖onDraw,然后你可能不得不使用Canvas.drawPoint绘制每个像素。