2011-01-02 14 views
98

SurfaceViewに描画するプロセス、つまりAndroidで使用されるSurface/Canvas/Bitmapシステム全体を理解するのは苦労しています。キャンバスとサーフェスのコンセプトを理解する

私はandroid-developersサイト、LynarLanderソースコード、this questionのいくつかのチュートリアルで見つけられたすべての記事とAPIドキュメントページを読んでいます。

これらのうち、どちらが当てはまりませんか、その理由は何かを教えてください。

  1. Canvasには、それ自体がBitmapと関連付けられています。 Surfaceには独自のCanvasが添付されています。
  2. すべてViewのウィンドウは同じSurfaceを共有し、同じCanvasを共有します。
  3. SurfaceViewは、それ自体、他のViewのサブクラスとは異なりとViewに描画するSurface独自のを持って、Viewのサブクラスで、ある

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

  • はなぜですビットマップによる高レベルの操作のためにすでにCanvasがある場合は、Surfaceクラスが必要です。 CanvasSurfaceができる仕事をするのに適していない状況の例を挙げてください。
+1

グラフィックアーキテクチャdoc:https://source.android.com/devices/graphics/architecture.html – fadden

答えて

193

ここにいくつかの定義である:

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

  • ウィンドウは基本的にデスクトップ上のウィンドウのようなものです。ウィンドウの内容がレンダリングされる単一のサーフェスを持ちます。アプリケーションは、ウィンドウマネージャを操作してウィンドウを作成します。ウィンドウマネージャは各ウィンドウのサーフェスを作成し、それを描画のためにアプリケーションに渡します。アプリケーションは、サーフェスに必要なものを描画できます。ウィンドウマネージャには、それは単なる不透明な四角形です。

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

  • SurfaceViewは、アプリケーションが直接描画するための独自の専用サーフェスを作成します(通常のビュー階層の外では、ウィンドウの単一サーフェスを共有する必要があります)。これは、予想よりも簡単です - SurfaceViewのすべての機能は、ウィンドウマネージャーに新しいウィンドウを作成し、そのウィンドウをSurfaceViewのウィンドウのすぐ後ろまたは前にZオーダーして、 SurfaceViewが含まれているウィンドウに表示されます。サーフェスがメインウィンドウの背後(Z順)に配置されている場合、サーフェスビューはサーフェスが見えるようにメインウィンドウの一部を透明にします。

  • ビットマップは、一部のピクセルデータへの単なるインターフェイスです。直接ピクセルを作成しているときに、ピクセルをBitmap自体で割り当てることができます。または、内部的にCanvasを描画のためにSurfaceにフックするなど、所有していないピクセルを指している可能性があります。 (ビットマップが作成され、表面の現在の描画バッファを指摘している。)

また、これは暗示するように、SurfaceViewはかなり重いオブジェクトである、ことを心に留めておいてください。特定のUIに複数のSurfaceViewがある場合は、これが本当に必要かどうかを考えずに考えてください。 3つ以上ある場合、あなたはほとんど確かに多くを持っています。ここで

+0

ありがとう!答えは物事をより明確にした。しかし、CanvasをSurfaceにフックすることについての部分は不明です。そのような操作が必要な場所は想像できません。次に、その操作の例を挙げることができます:キャンバスにBitmapを描く、SurfaceHolderから取得したlockCanvas()メソッド? – fyodorananiev

+0

これは描画の仕組みです。キャンバスは2D描画APIです。サーフェスに描画する場合は、Canvas 2D描画APIを使用して描画するためのバッファを指すCanvasを作成する必要があります。 – hackbod

+4

'#hackbod'sの返答に加えて、' Surface'も 'View'オブジェクトでは不可能なセカンダリスレッドからレンダリングすることができます – dheeran

15

ビットマップは単なるピクセルコレクションのラッパーです。他の便利な機能を備えたピクセルの配列と考えることができます。

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

SurfaceViewはサーフェスを含むビューです。サーフェスはビットマップに似ています(ピクセルストアを持っています)。私はそれがどのように実装されているのかわかりませんが、私はそれがビットマップのラッパー(画面上に直接関連するもののための余分なメソッドを持つ何らかのビットマップラッパーであると思います。サーフェスからキャンバスを取得することができます。このキャンバスは、基本的なビットマップに関連付けられているキャンバスを実際に取得しています。

ご質問。

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

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

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

いいえ、必要な数のサーフェスビューを作成できます。

3.SurfaceViewは、他のビューのサブクラスとは異なり、それ自体を見る、ビューのサブクラスであり、中に描画するために、独自の表面を有している。

はい。 ListViewと同様に、独自のListデータ構造を持つViewのサブクラスです。 Viewの各サブクラスは異なるものを実行します。

+0

ビットマップとサーフェスはピクセルストアの種類が異なり、どちらかをキャンバスできます? – fyodorananiev

+2

基本的にはyesです。キャンバスがサーフェスに書き込むことができない点を除いて、それはサーフェスが独自のピクセルストアとして使用しているもので動作します(アンドロイドのソースを見ることなく、それが何であるかはっきりとは言えません)。 CanvasはBitmapとGLのコンストラクタしか提供していないので、おそらくBitmapの拡張機能です。 – monkjack

+0

大きな助け、ありがとう!答えについて2。私の質問では、SurfaceViewsではなく標準のビューを意味しています。フィールドとボタンがたくさんあるRelativeLayoutがあるとします。この場合、サーフェスはウィンドウ全体に添付され、ビュー階層のすべてのビューで共有されますか? – fyodorananiev

25

A conceptual overview of Window, Surface, Canvas, and Bitmap

非常に基本的でシンプルな概念の相互作用は、ウィンドウの中で起こる方法の概要、表面、キャンバス、およびビットマップです。
視覚的な表現は、ねじれた概念を理解するのに役立ちます。
このグラフィックが誰かを助けることができれば幸いです。

+2

Visualy **画像**はテキストよりも優れています:D – Gattsu

+0

@Sabeesh: !! –

関連する問題