9

Android の ObjectAnimator について質問があります。ビューが上にスライドし (Y 値が減少)、その後同じ量「n」だけ下に戻り、続いてビューが再び上下にスライドしますが、今回は「n/2」だけスライドするバウンス効果をモデル化しようとしています (したがって、半分の距離)。

つまり、バウンスが大きくなり、バウンスが浅くなります。つまり、Mac アイコンが注意を引きたいときにトレイ内で行うようなものです。

これが私がこれまでに試したことです(vは a であると仮定しますView):

float y = v.getTranslationY(),distance = 20F;

                AnimatorSet s = new AnimatorSet();
                s.play(ObjectAnimator.ofFloat(v, "translationY", y- distance).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y- (distance/2)).setDuration(500))
                .before(ObjectAnimator.ofFloat(v, "translationY", y).setDuration(500));
                s.start();

コードの品質は無視してください。これは POC です。私はこれがうまくいくことを望んでいましたが、.before().

何かが欠けているように見えるので、1 つに融合しない複雑な AnimatorSet チェーンを作成する方法を教えてください。

ボーナス:追加のポイントについては、AnimatorSet の繰り返しを設定するにはどうすればよいですか?

どうもありがとう!

4

3 に答える 3

27

わかりましたので、流暢なビルダーを無視し、次のplaySequentially()ような方法を使用するだけで、シーケンシャル アニメーションを実現するかなりきちんとした方法を最終的に見つけました。

AnimatorSet as = new AnimatorSet();
as.playSequentially(ObjectAnimator.ofFloat(...), // anim 1
                    ObjectAnimator.ofFloat(...), // anim 2
                    ObjectAnimator.ofFloat(...), // anim 3
                    ObjectAnimator.ofFloat(...)); // anim 4
as.setDuration(600);
as.start();

ただし、リスナーでコールバック onAnimationEnd を含む汚いハックを除いて、繰り返しはまだうまくいきません。もっと簡単な方法でなければならないので、誰かが知っているときにこれを編集できるかもしれません。

とにかく、上記が誰かに役立つことを願っています。

于 2012-11-22T18:57:55.570 に答える
3

Builder を使用すると、返されるすべての依存関係が最初の Animator を参照するため、最初の動きの後に 3 つのバウンスが同時に発生しました。残念ながら、いくつかの側面で AnimatorSet が壊れているようです。そのうちの 1 つは繰り返しです: https://code.google.com/p/android/issues/detail?id=17662

于 2012-12-17T20:06:00.573 に答える