多くのデバイスでハードウェア アクセラレーションされたビューがあります。そのビュー内で、ハードウェア アクセラレーションが使用されているかどうかを確認できる必要があります。 Android SDK ドキュメント によると、これは を使用して行われView.isHardwareAccelerated()
ます。興味深いことに、ハードウェア アクセラレーションをサポートするデバイスでテストすると、ビュー自体が実際にはハードウェア アクセラレーションされているにもかかわらず、このメソッドは常に false を返します。(私はこれを最終的に確認しました)さらに混乱します:
に電話をかけると、View.getLayerType()
常に に設定されていることがわかりますView.LAYER_TYPE_NONE
。を呼び出すと、View.setLayerType(View.LAYER_TYPE_SOFTWARE)
ハードウェア アクセラレーションを効果的に無効にできます。View.setLayerType(View.LAYER_TYPE_HARDWARE)
ORを呼び出すことで再度有効にできますView.setLayerType(View.LAYER_TYPE_NONE)
。なぜView.LAYER_TYPE_NONE
ハードウェアアクセラレーションを有効にするのですか???
次に、ハードウェア アクセラレーションをサポートするデバイスの場合、設定されているかどうかを確認することでステータスを確認できるようですがView.LAYER_TYPE_SOFTWARE
、ハードウェア アクセラレーションをサポートしないデバイスではこの方法が機能しないのではないかと疑っています。View.isHardwareAccelerated()
使い方が悪いのか、単に壊れているのか知りたいです。
編集:問題の理解に少し近づいたと思います。この質問も役に立ちました:
実行時にハードウェア アクセラレーションを検出する: Android
私の作業理論では、ビューは、コンストラクターが呼び出されたときにハードウェアアクセラレーションされているかどうかをまだ認識していません。これは、チェックを行っている場所です。この場合、View を拡張するクラスで何をオーバーライドして、ハードウェア アクセラレーションを正常にチェックできるかを考えています。それView.onSizeChanged(...)
はうまくいくと思いますが、何度も呼び出される可能性のあるものを使用することは避けたいと思います。
編集#2:それがそうだったようです。チェックを移動したところ、View.onSizeChanged()
正しくレポートされるようになりました。ただし、このチェックを移動できるビュー内のより良い場所があるかどうかはまだ疑問に思っています。