118

Android で使用される/ /システムSurfaceView全体に描画するプロセスを理解するのに苦労しています。SurfaceCanvasBitmap

Android-developers サイトで見つけたすべての記事と API ドキュメント ページ、Android グラフィックスのいくつかのチュートリアル、LunarLander ソース コード、およびこの質問を読みました。

これらの記述のうち、どれが真実でどれがそうでないか、そしてその理由を教えてください。

  1. Canvas独自のものBitmapが付いています。Surface独自のものCanvasが付いています。
  2. すべてViewのウィンドウは同じものSurfaceを共有するため、同じものを共有しCanvasます。
  3. SurfaceViewは のサブクラスであり、他の のサブクラスやそれ自体Viewとは異なり、描画する独自のものがあります。ViewViewSurface

また、追加の質問が 1 つあります。

  • ビットマップを使用した高レベルの操作Surfaceが既にあるのに、なぜクラスが必要なのですか。できる仕事をするのにふさわしくないCanvas状況の例を挙げてください。CanvasSurface
4

3 に答える 3

236

ここにいくつかの定義があります:

  • サーフェスは、画面に合成されているピクセルを保持するオブジェクトです。画面に表示されるすべてのウィンドウ(ダイアログ、フルスクリーンアクティビティ、ステータスバー)には、描画する独自のサーフェスがあり、SurfaceFlingerはこれらを正しいZ順で最終的な表示にレンダリングします。サーフェスには通常、ダブルバッファレンダリングを行うために複数のバッファ(通常は2つ)があります。アプリケーションが終了するのを待たずに、サーフェスフリンガーが最後のバッファを使用して画面を合成している間に、アプリケーションは次のUI状態を描画できます。図。

  • ウィンドウは基本的に、デスクトップ上のウィンドウについて考えるようなものです。ウィンドウのコンテンツがレンダリングされる単一のサーフェスがあります。アプリケーションはウィンドウマネージャーと対話してウィンドウを作成します。ウィンドウマネージャは、ウィンドウごとにサーフェスを作成し、それをアプリケーションに渡して描画します。アプリケーションは、Surfaceに必要なものを描画できます。ウィンドウマネージャにとって、それは単なる不透明な長方形です。

  • ビューは、ウィンドウ内のインタラクティブなUI要素です。ウィンドウには単一のビュー階層がアタッチされており、ウィンドウのすべての動作を提供します。ウィンドウを再描画する必要があるときはいつでも(ビューがそれ自体を無効にしたためなど)、これはウィンドウのサーフェスに対して行われます。サーフェスがロックされ、描画に使用できるキャンバスが返されます。描画トラバーサルは階層の下で実行され、UIの一部を描画するために、ビューごとにキャンバスを渡します。完了すると、Surfaceのロックが解除されて投稿されるため、描画されたバッファがフォアグラウンドにスワップされ、SurfaceFlingerによって画面に合成されます。

  • SurfaceViewは、Viewの特別な実装であり、アプリケーションが直接描画するための専用のSurfaceも作成します(通常のビュー階層の外で、ウィンドウの単一のSurfaceを共有する必要があります)。これが機能する方法は、予想よりも簡単です。SurfaceViewが行うのは、ウィンドウマネージャーに新しいウィンドウを作成するように依頼し、SurfaceViewのウィンドウのすぐ後ろまたは前にそのウィンドウをZオーダーするように指示し、一致するように配置することだけです。ここで、SurfaceViewは含まれているウィンドウに表示されます。サーフェスがメインウィンドウの後ろに(Zオーダーで)配置されている場合、SurfaceViewは、サーフェスが見えるように、メインウィンドウのその部分も透明度で塗りつぶします。

  • ビットマップは、一部のピクセルデータへの単なるインターフェイスです。ピクセルは、直接作成するときにビットマップ自体によって割り当てられる場合があります。または、キャンバスをサーフェスにフックして描画する場合など、ビットマップが所有していないピクセルを指している場合もあります。(ビットマップが作成され、Surfaceの現在の描画バッファーを指します。)

また、これが意味するように、SurfaceViewはかなり重いオブジェクトであることにも注意してください。特定のUIに複数のSurfaceViewがある場合は、停止して、これが本当に必要かどうかを検討してください。2つ以上ある場合は、ほぼ確実に多すぎます。

于 2011-01-02T05:14:44.927 に答える
53

Window、Surface、Canvas、および Bitmap の概念的な概要

ここでは、ウィンドウ、サーフェス、キャンバス、およびビットマップ間で相互作用がどのように発生するかについて、非常に基本的で単純な概念の概要を示します。
ねじれた概念を理解するのに、視覚的な表現が大いに役立つ場合があります。
このグラフィックが誰かの役に立てば幸いです。

于 2016-07-21T06:27:07.767 に答える
19

Bitmap は、ピクセルのコレクションの単なるラッパーです。他の便利な機能を備えたピクセルの配列と考えてください。

Canvas は、すべての描画メソッドを含む単純なクラスです。AWT/Swing の Graphics クラスに慣れている場合は、これに似ています。円やボックスなどを描画する方法に関するすべてのロジックは、Canvas 内に含まれています。キャンバスはビットマップまたは開いている GL コンテナーに描画しますが、将来、他のタイプのラスターに描画するように拡張できる理由はありません。

SurfaceView は、Surface を含むビューです。サーフェスはビットマップに似ています (ピクセル ストアがあります)。実装方法はわかりませんが、画面表示に直接関連するもののための追加のメソッドを備えたある種のビットマップラッパーだと思います(これがサーフェスの理由であり、ビットマップは一般的すぎます)。基になるビットマップに関連付けられた Canvas を実際に取得している Surface から Canvas を取得できます。

あなたの質問。

1.キャンバスには独自のビットマップが添付されています。Surface には独自の Canvas が接続されています。

はい、キャンバスはビットマップ (または開いている GL パネル) で動作します。Surface は、Surface が Bitmap スタイルのピクセル ストアに使用しているすべての操作を行う Canvas を提供します。

2.ウィンドウのすべてのビューは同じサーフェスを共有するため、同じキャンバスを共有します。

いいえ。必要な数のサーフェス ビューを持つことができます。

3.SurfaceView は View のサブクラスであり、他の View のサブクラスや View 自体とは異なり、描画する独自の Surface を持っています。

はい。ListView が独自の List データ構造を持つ View のサブクラスであるように。View の各サブクラスは、異なる処理を行います。

于 2011-01-02T03:27:29.653 に答える