7

私はAndroid用のペイントアプリケーションを構築しています。SDKで提供されるFingerPaintアプリケーションサンプルを拡張します。ただし、FingerPaintとは異なり、サーフェスに描画するために別のレンダリングスレッドでSurfaceViewを使用しています。これはすべて非常に標準的で簡単です。うまく機能しています。ただ、塗装面に白い背景を付けたいので、まるで白い紙に描いているような感じです。デフォルトの背景は黒色です。サーフェスビューのスレッドは、ビューのonDraw()メソッドを呼び出します。

ここで直面している問題は、SurfaceViewに背景色または背景リソースを設定すると、次回ビューがレンダリングされるときに、この背景がサーフェスの以前の描画を上書きすることです。これを例で説明します。

背景を白色に設定したとします。これで、アプリケーションが起動し、SurfaceViewの色が白になります。わかりました、これまでのところ良いです。今、私は指でこの表面に赤い色の線を描きます。これで、線が白い表面に表示されます。良い。さて、これは絵付けアプリのはずで、車を描きたいとしましょう。そこで、2本目の赤い線を指で描きます。画面に2本目の線が引かれていますが、先ほど描いた1本目の線が消えてしまいます。つまり、SurfaceViewに背景を設定したため、背景が再度描画され、描画された最初の線が上書きされます。これで、画面には2番目に描かれた線だけが表示されます。

明らかに、私はこれが起こらないようにしたいと思います。背景を変更しようとしない場合、コードは完全に機能します(つまり、両方の線がデフォルトの黒い背景に表示され、背景は効果的に表示されません)。しかし、私がいくつかの望ましい背景を設定すると、このことが起こります。毎回描かれるわけではない、どういうわけか静的な背景を持つ方法はありますか?背景を一度だけ描画したいのですが、それ以降の描画はすべてこの背景行う必要があります。私は、Androidランタイムがビューを描画するたびに背景を描画することを望まないため、以前のレンダリングから、そのビューに存在するすべての描画を上書きします。これを回避する方法はありますか?

これを達成するために私が試したことは次のとおりです。

  1. XMLでandroid:backgroundを使用してSurfaceViewの背景色を設定します。

  2. スタイルの概念を使用して、上記を実行します。(スタイル値を指定し、レイアウトファイルで参照します)。スタイルは、背景色を#FFFFFFFF(白)として定義するだけです。

  3. 2のスタイルをSurfaceView(RelativeLayout)の親ビューに設定します。

  4. マニフェストファイルでandroid:themeを使用して、アプリケーション全体に2のスタイルをテーマとして設定します。

  5. SurfaceViewの背景描画可能ファイルを無地の白色の画像に設定します。

  6. コードからSurfaceViewのsetBackgroundColorをthis.setBackgroundColor(Color.WHITE)として呼び出します。

ありがとう。

4

2 に答える 2

2

アンドロイドのドキュメントによると:

サーフェスは、SurfaceViewを保持しているウィンドウの後ろになるようにZ順序になっています。SurfaceViewは、ウィンドウに穴を開けて、そのサーフェスを表示できるようにします。ビュー階層は、通常はその上に表示されるSurfaceViewの兄弟をSurfaceと正しく合成します。これは、Surfaceの上にボタンなどのオーバーレイを配置するために使用できますが、Surfaceが変更されるたびに完全なアルファブレンドコンポジットが実行されるため、パフォーマンスに影響を与える可能性があることに注意してください。

したがって、次の方法でサーフェスビューのzオーダーを変更した場合:

setZOrderOnTop(true);

これは機能しますが、サーフェスビューの上に他のビューを配置することはできません。

于 2012-03-20T02:52:22.717 に答える
1

次に、SurfaceViewを白い背景の別のビューにオーバーレイし、SurfaceViewを完全に透明に設定してみました。これにはFrameLayoutを使用しました。つまり、SurfaceViewが完全に透明に設定されている上にオーバーレイされた白い背景のビューです。

これも機能しませんでした。これで、SurfaceViewの背景色は変更できないという結論に達しました。これで、SurfaceViewを削除し、図面の代わりに通常のビューを使用しました。これまでのところ、パフォーマンスの低下は見られません。しかし、SurfaceViewで背景色を変更できないという理由だけで、効率的な実装を削除するのはちょっと間違っているように感じます。

于 2011-12-16T09:39:03.507 に答える