2012-08-25 14 views
10

私は多くのデバイスでハードウェアアクセラレーションされたビューを持っています。そのビューでは、ハードウェアアクセラレーションが使用されているかどうかを確認する必要があります。 According to Android SDK documentation、これはView.isHardwareAccelerated()を使用して行われます。興味深いのは、ハードウェアアクセラレーションをサポートするデバイスでテストするとき、このメソッドは実際にはビュー自体がハードウェアアクセラレーションされていても、常にfalseを返すことです。 (私は確かにこれを確認しました)それはもっと混乱します:View.isHardwareAccelerated()は常に偽です

View.getLayerType()に電話すると、それは常にView.LAYER_TYPE_NONEに設定されています。 に電話すると、ハードウェアアクセラレーションを効果的に無効にすることができます。 View.setLayerType(View.LAYER_TYPE_HARDWARE)またはView.setLayerType(View.LAYER_TYPE_NONE)のいずれかを呼び出して再度有効にすることができます。なぜView.LAYER_TYPE_NONEがハードウェアアクセラレーションを有効にするのですか?

hwアクセラレーションをサポートするデバイスでは、View.LAYER_TYPE_SOFTWAREが設定されているかどうかをチェックするだけで、この方法はhwアクセラレーションをサポートしていないデバイスではうまく動作しないとの疑いがあります。 View.isHardwareAccelerated()を乱用しているのか、それとも単に壊れているのかを知りたいです。

EDIT: 私はこの問題を理解するためにもう少し近いと思います。この質問にも役立ちました:

Detect Hardware Acceleration at Runtime: Android

私の作業理論が表示doesntのは、まだそれは私が私のチェックをやっているところである、コンストラクタが呼び出されますときには、ハードウェアアクセラレーションやないかどうかを知ることです。これが当てはまる場合、Viewを拡張するクラスでオーバーライドできるものがあり、ハードウェアアクセラレーションを正常にチェックできるようになります。私はView.onSizeChanged(...)がうまくいくと思っていますが、何度も呼び出される可能性のあるものを使わないでください。

編集#2: そうだったようです。私はView.onSizeChanged()に私の小切手を移動し、今正しく報告します。私はまだこのチェックを移動することができます私のビュー内のより良い場所theres場合は、私は思っています。

+0

私は不思議です、あなたはLAYER_TYPE_HARDWARE、LAYER_TYPE_SOFTWAREとLAYER_TYPE_NONEの違いを理解しましたか? –

答えて

2

私はしばらくこのことを熟考してきました。問題が何であるかを理解してくれてうれしいです。ドキュメントはこれを正しく説明していますが、それほど明確ではありません。 https://groups.google.com/forum/#!topic/android-developers/vAH0HAZg0uU

ビューが接続された後あなたはisHardwareAccelerated()をチェックする必要があります:ダイアンHackbornは、この記事で言及したよう

0

を「trueを返しビューはウィンドウとウィンドウにを添付されている場合は、ハードウェアが加速しています」ウィンドウ - 例えばonAttachedToWindow()で!

関連する問題