Как я могу сделать этот код для анимации более эффективным?

Этот код переключает y-position двух представлений (mView1 и mView2) при нажатии кнопки с помощью ObjectAnimator и AnimationSets. Во время анимации перевода значение alpha обоих представлений будет уменьшено и снова увеличено. Это просто установка, чтобы немного поиграть. Альфа-анимация определяется в XML, а анимация перевода выполняется с помощью кода.

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="0.5"
        android:valueType="floatType"/>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="1.0"
        android:valueType="floatType"/>
</set>
@Override
public void onClick(View v) {
    if (mView1 != null && mView2 != null) {

        int top = mView2.getTop();

        ObjectAnimator translateView1 = null;
        ObjectAnimator translateView2 = null;

        if (mView1.getTranslationY() == 0) {

                translateView1 = ObjectAnimator.ofFloat(mView1, "translationY", top);
            translateView2 = ObjectAnimator.ofFloat(mView2, "translationY", top*(-1));

        } else {

                translateView1 = ObjectAnimator.ofFloat(mView2, "translationY", 0);
            translateView2 = ObjectAnimator.ofFloat(mView1, "translationY", 0);

        }

        translateView1.setDuration(1000L);
        translateView2.setDuration(1000L);

        AnimatorSet alpha1 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
        alpha1.setTarget(mView1);

        AnimatorSet alpha2 = (AnimatorSet)AnimatorInflater.loadAnimator(mCtx, R.anim.switcher);
        alpha2.setTarget(mView2);

        AnimatorSet set = new AnimatorSet();
        set.playTogether(translateView1, translateView2, alpha1, alpha2);
        set.start();

    }
}

Теперь, поскольку это работает, как и ожидалось, я хочу знать, как я могу сократить код?

  • Действительно ли необходимо иметь отдельный экземпляр AnimatorSet для каждого View, который использует анимацию из XML? Могу ли я раздуть xml один раз и использовать его в разных AnimatorSets/ObjectAnimators? Потому что я не нашел сеттера, который принимает Animator в качестве аргумента.

  • Могу ли я определить несколько целей для одного AnimationSet/ObjectAnimator? Или это единственный способ определить разные ObjectAnimators для представлений и использовать их в AnimationSet?


person Steve Benett    schedule 25.03.2014    source источник


Ответы (1)


Вы захотите поместить код анимации в анимированный класс... вот так:

public class FadingView extends View {

    private ObjectAnimator fade, moveX, moveY;
    private AnimatorSet moveSet;

    public FadingView(Context context) {
        super(context);
    }

    private void fade(int duration, float...values) {

        if(fade==null) {
            fade = ObjectAnimator.ofFloat(this, "alpha", values);
        } else {
            fade.setFloatValues(values);
        }
        fade.setDuration(duration);
        fade.start();

    }

    private void move(int duration, int x, int y) {

        if(moveX==null) {
            moveX = ObjectAnimator.ofFloat(this, "translation_x", x);
        } else {
            moveX.setFloatValues(x);
        }
        if(moveY==null) {
            moveY = ObjectAnimator.ofFloat(this, "translation_y", y);
        } else {
            moveY.setFloatValues(y);
        }
        if(moveSet == null) {
            moveSet = new AnimatorSet();
            moveSet.playTogether(moveX, moveY);
        }

        moveSet.setDuration(duration);
        moveSet.start();

    }

    public void moveToUpperLeft(int duration) {
        move(duration, 0,0);
    }

    public void show(int duration) {
        fade(duration,1);
    }

    public void hide(int duration) {
        fade(duration,0);
    }

}

Просто базовый пример, но теперь вы можете позвонить:

FadingView view = new FadingView(context);
view.hide(500);
view.moveToUpperLeft(500);

Конечно, вы можете настроить и обобщить это еще больше ...

person ElDuderino    schedule 25.03.2014