カスタムビューを最適化する

操作や状態間の遷移に応答するビューを適切に設計する場合は、ビューが高速に動作するようにしてください。再生中に UI の動作が遅くなったり途切れたりしないようにするには、アニメーションが常に 60 フレーム/秒で動作していることを確認します。

表示速度を上げる

ビューを高速化するには、頻繁に呼び出されるルーチンから不要なコードを削除します。最初に onDraw() を使用します。これにより、費用対効果が最大になります。特に、onDraw() での割り当てを削除します。割り当てによってガベージ コレクションが発生し、スタッタリングが発生する可能性があるためです。初期化時またはアニメーション間でオブジェクトを割り当てます。アニメーションの実行中に割り当てを行わないでください。

onDraw() を簡潔にすることに加えて、呼び出し頻度は可能な限り少なくします。onDraw() の呼び出しは、ほとんどの場合、invalidate() の呼び出しの結果であるため、invalidate() の不要な呼び出しは除外します。

もう 1 つの非常に高コストな処理として、レイアウトのトラバースがあります。ビューが requestLayout() を呼び出すと、Android UI システムはビュー階層全体を走査して、各ビューに必要なサイズを見つけます。競合する測定値が見つかった場合は、階層を複数回走査することがあります。UI デザイナーは、ネストされた ViewGroup オブジェクトからなる深い階層を作成することがあります。このような深いビュー階層はパフォーマンスの問題を引き起こすため、ビュー階層は可能な限り浅くします。

複雑な UI がある場合は、カスタム ViewGroup を作成してレイアウトを実行することを検討してください。組み込みビューとは異なり、カスタムビューでは、子のサイズと形状についてアプリ固有の仮定を行うことができるため、測定値を計算するために子を走査する必要がなくなります。

たとえば、すべての子ビューに合わせてサイズを調節しないカスタム ViwGroup を使用すると、すべての子ビューを測定するオーバーヘッドを回避できます。さまざまなユースケースに対応する組み込みレイアウトを使用する場合、この最適化は実現できません。