17

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()BitmapImageViewPresentation

ただし、ハードウェアアクセラレーションを有効にするsetDrawingCacheEnabled(true) と、多少の操作は不要になります。

描画キャッシュを有効にすることは、ハードウェアアクセラレーションがオフになっているときにレイヤーを設定することに似ています。ハードウェアアクセラレーションがオンになっている場合、システムはフラグを無視するアクセラレーションに別のメカニズムを使用するため、描画キャッシュを有効にしてもレンダリングには影響しません。

このような場合に呼び出すと、実際にキャッシュを使用するのではなく、getDrawingCache()のフルdraw()Viewビットマップに裏打ちされたものになります。費用がかかる可能性があるため、頻繁に実行Canvasすると(たとえば、経由でトリガーされる)、ジャンクが発生します。draw()draw()postOnAnimation()

getDrawingCache()したがって、ハードウェアアクセラレーションを有効にして使用でき、このミラーリングを設定するために使用でき、より効率的な他の「描画キャッシュ」があるかどうかを判断しようとしています。SDKアプリの観点からは、レイヤーは事実上書き込み専用であるため、私が見る限り、そのようなキャッシュはありません。しかし、私はおそらく私がいくつかの解決策を逃していることを望んでいます。

前もって感謝します!

4

1 に答える 1

13

使用することはできますsetLayerType(View.LAYER_TYPE_SOFTWARE, null)が、更新するたびにビューの再描画が遅くなるという副作用があります。ViewGroup2つのキャンバス(画面ごとに1つ)にビューを描画するカスタムを作成する方がはるかに効率的です。またViewTreeObserver、描画コールバックごとにaを使用して、ビューを2番目の画面に強制的にレンダリングすることもできます。このようなユースケースでは、描画キャッシュ/レイヤータイプを悪用しないことを強くお勧めします。

于 2013-03-21T15:31:56.213 に答える