Изменить несколько свойств с помощью одного 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?
спасибо!
5 ответов
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
Я думаю, вы должны использовать 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 как вы хотите.
Если вы анимируете представление (как предлагает ваш пример), вы можете использовать ViewPropertyAnimator:
view.animate().translationX(value_x).translationY(value_y).setDuration(duration).start();
альтернативный подход, который я использовал для добавления нескольких свойств в анимацию объекта, заключается в использовании сочетания кода и 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();
анимация просмотра может быть выполнена еще проще:
v.animate().x(valueX).y(valueY).setDuration(500).start();
(в этом фрагменте был использован ViewPropertyAnimator).