web-dev-qa-db-ja.com

1つのアニメーションを複数のビューに同時に適用する

そのため、すべて同じ回転仕様を使用して、いくつかのビューをすべて同時に回転させたいと思います。問題は、何らかの理由で、回転が2番目の要素に対して異なる動作をすることです。どうやらこれは、アニメーションオブジェクトがこれらの2行のコード間で実際に状態を変更することに関係しているようです。もちろん、別のアニメーションオブジェクトを作成して適用することもできますが、もっと簡単な方法があるように感じます(約15のビューがあります)

最初のビューのみを正しく回転します。

Animation rotateAnim = AnimationUtils.loadAnimation(this, R.anim.rotationtoportrait);
target.startAnimation(rotateAnim);
lightBtn.startAnimation(rotateAnim);

両方を正しく回転させます

Animation rotateAnim = AnimationUtils.loadAnimation(this, R.anim.rotationtoportrait);
Animation rotateAnim2 = AnimationUtils.loadAnimation(this, R.anim.rotationtoportrait);
target.startAnimation(rotateAnim);
lightBtn.startAnimation(rotateAnim2);

XML:

<?xml version="1.0" encoding="utf-8"?>
<rotate
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:fromDegrees="-90"
    Android:toDegrees="0"
    Android:pivotX="50%"
    Android:pivotY="50%"
    Android:duration="500" Android:fillAfter="true">

誰かアイデアはありますか?

22
Jameo

だから、これは不可能だと思うので、同じアニメーションをビューのリストに適用するヘルパーメソッドを作成しました。

public void doRotations(ArrayList<View> views, int start, int end, int xprop, float xscale, int yprop, float yscale, int duration, Boolean fillAfter){

    for(int i = 0; i < views.size(); i++){
        RotateAnimation temp = new RotateAnimation(start, end, xprop, xscale, yprop, yscale);
        temp.setDuration(duration);
        temp.setFillAfter(fillAfter);
        views.get(i).startAnimation(temp);
    }
}

間違いなくハックですが、私が今できることはそれだけだと思います

5
Jameo

このようにしてください:

ObjectAnimator anim = ObjectAnimator.ofFloat(view, "y", 100f);
arrayListObjectAnimators.add(anim);

ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "x", 0f);
arrayListObjectAnimators.add(anim1);

ObjectAnimator[] objectAnimators = arrayListObjectAnimators.toArray(new ObjectAnimator[arrayListObjectAnimators.size()]);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(objectAnimators);
animSetXY.duration(1000);
animSetXY.start();
10
Leandros