それで、私の謎の重要な手がかりは、それがエミュレーターでは機能したが、ハードウェアデバイスでは機能しなかったということのようでした。
ハードウェアレンダリング
Android開発者のWebサイトのハードウェアレンダリングページを熟読しましたが、明らかに十分ではありません。
http://developer.android.com/guide/topics/graphics/hardware-accel.html
APIはバージョン11以降で利用可能であると記載されていますが、APIレベル14(ICS)以降、すべてのアプリケーションでハードウェアレンダリングがデフォルトでオンになっているとは言えません。
これは私たちにとってどういう意味ですか?
ほとんどすべてが高速です。動作しないいくつかのことを除いて。
私は気づかずに、これらのうちの2つに違反することに成功しました。
- Canvas.DrawTextOnPath()
- Paint.setShadowLayer()
APIリファレンス(または私が見つけることができる他の場所、そして確かにLintによってチェックされていない場所)には記載されていませんが、リストされている操作のいずれかを使用すると、奇妙なことができます。
私の場合、Canvas.DrawTextOnPath()は問題なく機能しているように見えました。
しかし、Androidは、私が手に使用したペイントにシャドウレイヤーが設定されていることに気付いたとき、それを黙って無視しました。
ビューがハードウェアアクセラレーションされているかどうかはどうすればわかりますか?
上記のドキュメントリンクから:
アプリケーションがハードウェアアクセラレーションされているかどうかを確認するには、次の2つの方法があります。
- View.isHardwareAccelerated()は、ビューがハードウェアアクセラレーションウィンドウに接続されている場合にtrueを返します。
- Canvasがハードウェアアクセラレーションされている場合、Canvas.isHardwareAccelerated()はtrueを返します
図面コードでこのチェックを行う必要がある場合は、可能であれば、View.isHardwareAccelerated()の代わりにCanvas.isHardwareAccelerated()を使用してください。ビューがハードウェアアクセラレーションウィンドウにアタッチされている場合でも、ハードウェア以外のアクセラレーションキャンバスを使用して描画できます。これは、たとえば、キャッシュの目的でビューをビットマップに描画するときに発生します。
私の場合、逆のことが起こったようです。カスタムビューは、ハードウェアアクセラレーションではないことをログに記録します。ただし、キャンバスはハードウェアアクセラレーションであると報告します。
回避策と修正
最も簡単な修正は、カスタムビューにソフトウェアレンダリングを強制することです。ドキュメントによると、これは次の方法で実行できます。
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
または、問題のある操作を削除して、ハードウェアレンダリングをオンのままにしておくこともできます。
私の不幸から学びなさい。頑張ってください。