2012-03-08 8 views
0

複雑な数学的表現に基づいてランダムな画像を生成するAndroid Appを作成しています。ピクセルの色は、その位置と選択された式に依存します。 (私は "ランダムアート"を生成する多くのiPhoneアプリを見てきましたが、比較的少数のAndroidアプリを見ていました)SurfaceViewを使用して1つの複合画像を描画する方法

Nexus Sデベロッパーの携帯電話で画像を描くには5〜15秒かかります。

UIスレッドを応答し続けるために、これはSurfaceViewクラスの目的のようです。 SurfaceViewのほとんどすべての例は、アニメーションを扱い、単一の複雑な画像ではありません。画像が描画/レンダリングされたら、ユーザーまで

のように変更することはありません。SurfaceView正しいコンポーネントを使用しますか?もしそうなら、SurfaceViewまたはその内部スレッドから、画像のレンダリングが終了したときにコールバックを受け取ることはできますか?コールバックは、私がそれが高解像度の画像アートの低解像度と塊状のバージョンを切り替えることは大丈夫だと知っている?

SurfaceViewには、単一画像の複雑なレンダリングに適した代替品がありますか? (アニメーションではありません)

乾杯!

+0

なぜopenGlを使用しないのですか? – slayton

+0

通常のSurfaceViewよりもOpenGL(GLSurfaceViewを前提とする)を使用する利点は何ですか? –

+1

減速はレンダリングではなく計算にあるためです。任意の数学的計算をGLSLシェーダ言語にオフロードすることは難しいです:)。 NDKルートに行くか、RenderScriptのCompute APIを使う方が良いかもしれません。 –

答えて

1

他のスレッドに1つの複雑なイメージをレンダリングしてUIを応答性にしておきたい場合は、レンダリングが完了したら実際に描画してください。標準的な作業-UIスレッドの方法で、AsyncTaskのようなものを使用します。 GPUに実際のレンダリング計算をオフロードできると示唆している場合を除いて、実際にGPUに特化したものではありません。

私は、それがsetPixelsを使用してビットマップを単にあなたが終わった後、AsyncTaskであなたのピクセルを表す配列を構築するとともに、少なくとも実験を作成し、そのビットマップにImageViewのソースを設定します。

画像をピクセル単位で表示したい場合は、SurfaceViewが妥当な選択肢になります。この場合、基本的にアニメーションになり、他のチュートリアルに従うことができます。他にもいくつかの設定がありますが、主なものはonDrawをオーバーライドすることです。次に、Canvas.drawPointを使用して各ピクセルを描画する必要があります。

関連する問題