15

現在、ビューをアニメーション化するときにハードウェア レイヤーを適切に使用する方法を考え出そうとしています。

ユーザーが子ビューをドラッグできるようにするViewGroupを実装しています。その後、子ビューを解放したときの位置にアニメーション化します(ViewPagerがページに落ち着く方法など)。この記事では、アニメーションの期間中のみハードウェア レイヤーを有効にする必要があると述べています。

私が抱えている問題は、ハードウェア レイヤーが有効になった後、Android がレイヤーを作成する必要があり、Galaxy Nexus で 70 ~ 100 ミリ秒かかることです。これは、ドラッグとアニメーションの間に遅延があると非常に目立つため、アニメーションを開始する直前にそれを行うことができないことを意味します。同じ理由で、ドラッグを開始するときにも有効にできません。

現在、この遅延はハードウェア レイヤーが最初に作成されたときにのみ存在するため、ビューがレイアウトに追加されるとすぐに作成されることが理想的です。View.buildLayer()を指摘されましたが、これにアプローチする方法がわかりません。

  • これを達成する正しい方法は何ですか?
  • 子ビューでオーバーライドして buildLayer() を呼び出すことができる ViewGroup のメソッドはありますか?
  • ハードウェア レイヤーが何らかの方法で無効化され、さらに 70 ~ 100 ミリ秒の遅延が発生する可能性はありますか? そして、これをどのように処理しますか?
4

1 に答える 1

13

遅延は、キャッシュにレイヤーがない場合に発生します。setLayerType(NONE)/setLayerType(HARDWARE) への後続の呼び出しでは、この遅延は発生しません。onSizeChanged() から buildLayer() を呼び出して、レイヤーを強制的に構築してからキャッシュに入れることができます (setLayerType(NONE) を呼び出してレイヤーをキャッシュに移動します)。

表示される遅延は、実行しているデバイスに大きく依存することに注意してください。

レイヤーを有効にしておくべきではない理由は、ビューが更新されるたびに描画作業の量が 2 倍になるためです。たとえば、ListView をレイヤーに移動してからリストをスクロールすると、スクロール アニメーション中にフレームが更新されるたびに、(a) リストがレイヤーに再描画され、(b) レイヤーが画面に描画されます。これは非常に無駄が多く、UI の複雑さによってはパフォーマンスの問題が発生する可能性があります。

于 2012-09-04T22:36:03.570 に答える