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繪製每個像素。