TL; DR:ハードウェアアクセラレーションが有効になっている場合にgetDrawingCache()
完全な再描画をトリガーするように見えるので、おそらく(ハードウェア、ソフトウェア)に入力されたデータを読み取ることによって、これを回避する(またはそれらの線に沿った何か)View
を取得する代替手段はありますか?最後に描かれBitmap
たのはいつですか?View
いくつかの背景:
Androidには、接続されたHDMIディスプレイなど、Android3.0以降の画面をミラーリングする機能があります。これはプレゼンテーションに使用できますが、聴衆はプレゼンターと同じものを見ることになり、必ずしも理想的とは限りません。
Android 4.2が追加されPresentation
、アプリが「セカンドスクリーン」に任意のものを配置できるようになりました(例:HDMI接続ディスプレイ)。この場合、2番目の画面にメインタブレットのディスプレイに表示されている内容の一部が表示されていると便利な場合があります。Microsoft PowerPointやLibreOfficeImpressなどのプレゼンテーションソフトウェアについて考えると、一般的なデュアルスクリーン設定では、聴衆には現在のプレゼンテーションスライドが表示され、プレゼンターには現在のスライドとタイマーとスピーカーのメモが表示されます...
スライドを表すPNGのような非インタラクティブなコンテンツの場合、これは単に両方の画面に同じ画像を表示するだけの問題です(メイン画面の他のものと一緒に)。
ただし、のようなインタラクティブコンテンツの場合、WebView
この種のミラーリングを行うのは難しい場合があります。たとえば、aのコンテンツがいつ変更されるかを知る良い方法はありません。これは、個別に行うことではなく、純粋にそれ自体WebView
の内部のもの(たとえば、AJAX呼び出しの完了)に基づいて変更される可能性があるためです。WebView
また、コンテンツがいつ変更されたかを知っていWebView
たとしても、他の人WebView
に同じコンテンツをレンダリングさせる良い方法はありません。
そこで、コンテナのコンテンツを取得して、それを画面上にレンダリングできる人(たとえば、に表示されている)に配信するためにMirroringFrameLayout
使用するを設定しようと考えました。getDrawingCache()
Bitmap
ImageView
Presentation
ただし、ハードウェアアクセラレーションを有効にするsetDrawingCacheEnabled(true)
と、多少の操作は不要になります。
描画キャッシュを有効にすることは、ハードウェアアクセラレーションがオフになっているときにレイヤーを設定することに似ています。ハードウェアアクセラレーションがオンになっている場合、システムはフラグを無視するアクセラレーションに別のメカニズムを使用するため、描画キャッシュを有効にしてもレンダリングには影響しません。
このような場合に呼び出すと、実際にキャッシュを使用するのではなく、getDrawingCache()
のフルdraw()
がView
ビットマップに裏打ちされたものになります。費用がかかる可能性があるため、頻繁に実行Canvas
すると(たとえば、経由でトリガーされる)、ジャンクが発生します。draw()
draw()
postOnAnimation()
getDrawingCache()
したがって、ハードウェアアクセラレーションを有効にして使用でき、このミラーリングを設定するために使用でき、より効率的な他の「描画キャッシュ」があるかどうかを判断しようとしています。SDKアプリの観点からは、レイヤーは事実上書き込み専用であるため、私が見る限り、そのようなキャッシュはありません。しかし、私はおそらく私がいくつかの解決策を逃していることを望んでいます。
前もって感謝します!