[解決済み] CanvasとSurfaceの概念を理解する
質問
への描画処理を理解するのに苦労しています。
SurfaceView
に描画され、その結果、全体の
Surface
/
Canvas
/
Bitmap
という、Androidで採用されている方式を採用しています。
私は、android-developers のサイトで見つけることができたすべての記事と API ドキュメントページ、android graphics のいくつかのチュートリアル、LunarLander のソースコード、そして、android-developers のサイトで見つけた この質問 .
これらの記述のうち、どれが真実で、どれが真実でないか、またその理由を教えてください。
-
Canvas
は、独自のBitmap
が付加されている。Surface
には、それ自身のCanvas
が付加されています。 -
すべての
View
のウィンドウは同じSurface
を共有し、その結果、同じCanvas
. -
SurfaceView
のサブクラスです。View
とは異なり、他のView
のサブクラスやView
自体が、そのSurface
で描画する。
また、追加で1つ質問があります。
-
なぜ
Surface
クラスが既に存在するのであればCanvas
があれば、ビットマップを使った高水準の操作のために のような状況の例を挙げてください。Canvas
が適していない例を挙げて下さい。Surface
ができる仕事をするのに適していない。
どのように解決するのですか?
いくつかの定義があります。
-
サーフェスとは、画面に合成されるピクセルを保持するオブジェクトのことです。 画面に表示されるすべてのウィンドウ (ダイアログ、フルスクリーン活動、ステータス バー) は、描画される独自のサーフェスを持っており、Surface Flinger はこれらを正しい Z オーダーで最終的なディスプレイにレンダリングします。 サーフェスは通常、ダブル バッファ レンダリングを行うために複数のバッファ (通常は 2 つ) を持ちます。サーフェス フリンガーが最後のバッファを使用して画面を合成している間、アプリケーションは次の UI 状態を描画でき、アプリケーションが描画を終了するのを待つ必要がありません。
-
ウィンドウは基本的に、デスクトップ上のウィンドウを考えているようなものです。 ウィンドウのコンテンツがレンダリングされる単一のサーフェスを持っています。 アプリケーションは Window Manager とやり取りしてウィンドウを作成します。Window Manager は各ウィンドウに Surface を作成し、描画用にそれをアプリケーションに渡します。 ウィンドウ マネージャは各ウィンドウのサーフェスを作成し、描画用にアプリケーションに渡します。アプリケーションはサーフェスに好きなものを描くことができますが、ウィンドウ マネージャにとってそれは単なる不透明な四角形です。
-
ビューはウィンドウの中の対話的な UI 要素です。 ウィンドウはそれに接続された単一のビュー階層を持ち、それはウィンドウのすべての動作を提供します。 ウィンドウを再描画する必要があるときはいつでも (ビューがそれ自身を無効にした場合など)、これはウィンドウのサーフェスで行われます。 Surfaceはロックされ、その中に描画するために使用できるCanvasが返されます。 描画のトラバーサルは、UIの一部を描画するために、各ビューのためにCanvasを渡して、階層を下って行われます。 描画が完了すると、Surface はロック解除され、描画されたばかりのバッファが前景にスワップされ、Surface Flinger によって画面に合成されるようにポストされます。
-
SurfaceView は、アプリケーションが直接描画するために、それ自身の専用の Surface を作成する View の特別な実装です(通常のビュー階層の外側で、それ以外はウィンドウ用の単一の Surface を共有しなければなりません)。 SurfaceViewが行うことは、ウィンドウマネージャに新しいウィンドウを作成するように依頼し、そのウィンドウをSurfaceViewのウィンドウのすぐ後ろか前にZオーダーするように指示し、SurfaceViewが含まれているウィンドウに表示される場所に一致するように配置することです。 表面がメインウィンドウの後ろに(Z順序で)配置されている場合、SurfaceViewは表面が見えるように、メインウィンドウのその部分を透明で埋めます。
-
Bitmapはいくつかのピクセルデータへのインターフェースに過ぎません。 ピクセルは、直接作成する場合はビットマップ自身によって割り当てられるかもしれませんし、描画のためにキャンバスをサーフェスにフックするために内部的に起こることのように、ビットマップが所有していないピクセルにポイントされるかもしれません。 (Bitmapが作成され、Surfaceの現在の描画バッファを指します。)また、Bitmapが作成され、Surfaceの現在の描画バッファを指します。
また、これが示唆するように、SurfaceViewはかなりヘビーウェイトなオブジェクトであることを心に留めておいてください。 特定のUIで複数のSurfaceViewを持っている場合、これが本当に必要なのかどうか立ち止まって考えてみてください。 2つ以上ある場合は、ほぼ間違いなく多すぎます。
関連
-
[解決済み] TextViewでテキストを水平・垂直方向にセンタリングするには?
-
[解決済み] アイコンのミップマップ描画可能
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] Travis.yml ./gradlew : パーミッションが拒否されました。
-
[解決済み] 文字列リソースにHTML?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ViewPagerのアイテムを強制的に再インスタンス化する方法 [重複].
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] ProjectScopeServices に Factory タイプのサービスはありません。
-
[解決済み] proguard hell - 参照されているクラスが見つかりません。
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] LayoutParamsの高さを密度に依存しないピクセル数でプログラム的に設定する。
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理