Изменить несколько свойств с помощью одного объекта ObjectAnimator?

У меня довольно сложная анимация, которую мне нужно закодировать, и я использую кучу ObjectAnimators, как показано ниже:

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, TRANSLATION_X, value).setDuration(BASE_DURATION * 2);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(view, TRANSLATION_Y, value).setDuration(BASE_DURATION * 2);

Можно ли группировать преобразования X и Y в один и тот же ObjectAnimator, а не создавать кучу из них, а затем добавлять их все в AnimatorSet?

Спасибо!

Ответ 1

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(TRANSLATION_X, value);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(TRANSLATION_Y, value);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY);
animator.setDuration(BASE_DURATION * 2);
animator.start();

http://developer.android.com/guide/topics/graphics/prop-animation.html#views  Один ObjectAnimator

Ответ 2

Я думаю, вы должны использовать AnimationSet. Он практически делает то, что вы хотите, и это хороший способ сделать это, потому что, когда я думаю о PropertyValuesHolder, я не думаю о ключевых кадрах.

Итак, да:

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, TRANSLATION_X, value);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(view, TRANSLATION_Y, value);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator1, objectAnimator2);
animatorSet.setDuration(BASE_DURATION * 2);

animatorSet.start();

Вы можете добавить столько ObjectAnimators, сколько хотите.

Ответ 3

Если вы анимируете представление (как показано в примере), вы можете использовать ViewPropertyAnimator:

view.animate().translationX(value_x).translationY(value_y).setDuration(duration).start();

Ответ 4

Альтернативный подход, который я использовал для добавления нескольких свойств объектной анимации, заключается в использовании сочетания кода и XML для определения анимации. Это основано на этой документации

Например, в XML я могу настроить AnimatorSets и ObjectAnimators для одного объекта со статическими значениями и определить последовательную последовательность изменений (res/animator/moveout.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="scaleX"
            android:duration="2000"
            android:valueTo="0.8"
            android:interpolator="@android:anim/decelerate_interpolator"/>
        <objectAnimator
            android:propertyName="scaleY"
            android:duration="2000"
            android:valueTo="0.8"
            android:interpolator="@android:anim/decelerate_interpolator"/>
        <objectAnimator
            android:propertyName="alpha"
            android:duration="2000"
            android:valueTo="0"
            android:interpolator="@android:anim/decelerate_interpolator"/>
    </set>
    <set>
        <objectAnimator
            android:propertyName="scaleX"
            android:duration="2000"
            android:valueTo="1.2"
            android:interpolator="@android:anim/accelerate_interpolator"/>
        <objectAnimator
            android:propertyName="scaleY"
            android:duration="2000"
            android:valueTo="1.2"
            android:interpolator="@android:anim/accelerate_interpolator"/>
        <objectAnimator
            android:propertyName="alpha"
            android:duration="2000"
            android:valueTo="1"
            android:interpolator="@android:anim/accelerate_interpolator"/>
    </set>
</set>

Затем я могу загрузить эти AnimatorSets/ObjectAnimators во время выполнения и изменить их значения с помощью динамически генерируемых значений:

    AnimatorSet firstSet = (AnimatorSet) AnimatorInflater.loadAnimator(this,
            R.animator.moveout);

    AnimatorSet secondSet = firstSet.clone();
    firstSet.setTarget(button);
    secondSet.setTarget(anotherButton);

    // Choreograph the animations
    // Change the duration of all child elements in the set
    firstSet.setDuration(1000);
    secondSet.setDuration(200);

    // Set start delay so second set plays after the first set
    secondSet.setStartDelay(2000);
    AnimatorSet anim = new AnimatorSet();
    anim.playTogether(firstSet,secondSet);
    anim.start();

Ответ 5

Анимационный просмотр можно сделать еще проще:

v.animate().x(valueX).y(valueY).setDuration(500).start();

(В этом фрагменте используется ViewPropertyAnimator).