我正在创建一个基于复杂数学表达式生成随机图像的Android应用程序。像素的颜色取决于其位置和所选择的表达式。 (我见过许多iPhone应用程序产生“随机艺术”但相对较少的Android应用程序。)
在Nexus S开发手机上绘制图像需要5到15秒。
为了保持UI线程的响应,这似乎是SurfaceView
类的目的。几乎SurfaceView
的所有例子都涉及动画,而不是单个复杂的图像。一旦完成图像的绘制/渲染,我将不会更改它直到用户
那么,SurfaceView
是正确的组件吗?如果是这样,我可以在完成绘制图像时完成绘制时从SurfaceView
或其内部线程获得回调吗?回调是如此我知道可以用高分辨率切换图像艺术的低分辨率和块状版本吗?
是否有SurfaceView
的替代方案,对于单个图像的复杂渲染更好。 (不是动画。)
干杯!
答案 0 :(得分:1)
如果您只想在另一个线程上渲染单个复杂图像以保持UI响应,那么在完成渲染后实际绘制它时,您可能会考虑在标准保持工作中执行此操作使用类似AsyncTask
之类的UI线程方式。这不像你在做合成或任何真正特定于GPU的东西(除非其他人建议你可以将实际的渲染计算卸载到GPU)。
我至少会尝试在AsyncTask
中构建一个代表像素的数组,然后在完成后,使用setPixels
创建一个位图并设置{{1}的来源到那个位图。
另一方面,如果你希望你的图像逐像素显示,那么ImageView
可能是一个合理的选择,在这种情况下,它基本上是一个动画,所以你可以按照其他教程。还有一些其他的设置,但主要的是覆盖onDraw
,然后你可能不得不使用Canvas.drawPoint
来绘制每个像素。