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

ジェスチャーと状態間の遷移に応答するビューを適切に設計できたら、次はビューが高速に実行されるようにします。再生中に UI の表示が遅くなったり途切れたりすることを避けるために、アニメーションが常に 60 フレーム/秒で実行されるようにしてください。

ビューを高速化する

ビューを高速化するには、頻繁に呼び出されるルーチンから不要なコードを削除します。まずは、効果が大きい onDraw() の見直しから始めます。特に、onDraw() 内での割り当てをなくす必要があります。割り当てによってガベージ コレクションが発生し、スタッタリングが引き起こされることがあるからです。オブジェクトの割り当ては、初期化中か、アニメーションの合間に行います。アニメーションの実行中は割り当てを行わないようにしてください。

onDraw() を簡素化するだけでなく、呼び出しの頻度もできる限り減らします。ほとんどの onDraw() 呼び出しは、 invalidate() 呼び出しの結果として発生するため、 不要な invalidate() 呼び出しを削除してください。

もう 1 つの非常に高コストな処理として、レイアウトのトラバースがあります。ビューが requestLayout() を呼び出すとき、Android UI システムはビュー階層全体をトラバースして、各ビューが必要とするサイズを検出します。競合する測定値が見つかると、何度もビュー階層をトラバースする必要が生じます。UI 設計者は、ネストされた ViewGroup オブジェクトによる深いビュー階層を作成することがあります。このような深いビュー階層は、パフォーマンス上の問題を引き起こすため、ビュー階層はできる限り浅くしてください。

複雑な UI がある場合は、カスタム ViewGroup を作成して UI のレイアウトを実行することをおすすめします。 カスタムビューは、ビルトインビューとは異なり、子のサイズと形状に関してアプリ固有の仮定を行うことができるため、測定値を計算するために子を走査する処理を回避できます。

たとえば、すべての子ビューに合わせて独自のサイズを調整しないカスタム ViewGroup がある場合、すべての子ビューを測定するオーバーヘッドを回避できます。広範なユースケースに対応するビルトイン レイアウトを使用している場合、この最適化はできません。