10

私はAndroidアプリのカスタムビューをアニメーション化する作業を進めています。私はProperty Animationsを経由して、これを達成し、などhttps://developer.android.com/guide/topics/graphics/prop-animation.htmlごとに、onAnimationUpdate()コールバックでの表示にinvalidate()を呼び出しています:どのような性質に応じて、またはあなたは、ビュー上で無効化()メソッドを呼び出す必要があります、アニメーション化されているオブジェクトアクティビティの開始時のアニメーションジャンプ

更新されたアニメーション値で画面を強制的に再描画します。これは、onAnimationUpdate()コールバックで行います。

私の問題は、これらのアニメーションは新発売活動の先頭に実行されたとき、彼らは彼らが非常に目立ってジャンプさせ、最初にフレームをスキップということです。私は両方を試してみました:

  1. アクティビティのルートビューのViewTreeObserverを使用してOnGlobalLayout()コールバック時にアニメーションを開始する活動のonCreate()方法
  2. からすぐにアニメーションを開始します。

私はレイアウトがファイナライズされる前にアニメーションが呼び出された可能性がありますが、結果は同じであると思っていたため、後者を行いました。

ログを使用して、onAnimationUpdate()コールバックがアニメーション全体で(つまり、最初から最後まで10〜20ミリ秒ごとに)一貫して呼び出されると判断しました。 onAnimationUpdate()は、単にinvalidate()を呼び出します。これにより、ビューを直ちに再描画することが理想的です(しかし、ドキュメンテーションはこれが "将来のある時点で発生する"と主張しています)。それはまさに問題のようです:onDraw()は、250ミリ秒ほど呼び出されないうちに最初の1回または2回だけ呼び出されます。この後、それは全時間を持つべきであるので、10〜20ミリ秒ごとに呼び出されることを再開する。しかし、その時間のブロックは、アニメーションにおいて非常に顕著な遅れを生じさせる。

この問題は、アクティビティの開始時にのみ発生します。アニメーションを開始する前に300msの遅延を設定するだけで、スムーズに動作します。しかし、私はそれがハッキーだから、その解決策が気に入らない。問題は、onDraw()がアクティビティの開始付近ですぐにinvalidate()に呼び出されないということです。しかし、私はこれがなぜであるか、ブロックするものはonDraw()か、まったく修正する方法を理解できません。

このStackOverFlowスレッドだけが見つかりました:Animation at the beginning of activity skips framesポスターがと同じの問題があります。基本的なコードはそこにあり、ビデオは問題を明確にします。私は自分のコードを投稿することもできますが、最も基本的なテストアプリにこの問題が出ているということは、何か他のことが起こっていることを示していると思います。

答えて

5

コードが添付されていないので、あなたはアクティビティにいくつかのトランジションアニメーションがあると仮定しています。この場合、問題が発生する可能性があります.2つのアニメーションが同時に実行されているためです。トランジションを無効にして試してみてください。

startActivity(intent); 
getActivity().overridePendingTransition(0, 0); 
+1

カスタムトランジションアニメーションはありませんでしたが、デフォルトではオンになっています。提案されているようにトランジションアニメーションを無効にすると、実際にアニメーションが修正されました。しかし、これは不快なので、[onEnterAnimationComplete()](https://developer.android.com/reference/android/app/Activity.html#onEnterAnimationComplete())という次のアクティビティコールバックが見つかりました。この問題は正式にここで説明されています:「アクティビティは、ウィンドウがアニメーション化されている期間中は描画できません。そのコールバックからアニメーションを開始すると、問題が解決されます。 – asaini007

+0

@ asaini007メソッドはそこにあります... API 21からしか利用できません。ところで、それは常に動作していません。 –

2

あなたの描画ループのUIスレッドが枯渇しているようです。

私はトレースビューを使用して、描画呼び出しをブロックするメソッドがないことを確認します。http://tools.android.com/tips/traceview

これは、onDrawメソッドの代わりに何が呼び出されているかを判断するのに役立ちます。

関連する問題