web-dev-qa-db-fra.com

Changer plusieurs propriétés avec un seul ObjectAnimator?

J'ai une animation assez complexe que je dois coder et j'utilise un tas d'ObjectAnimators comme celui-ci:

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

Est-il possible de regrouper les traductions X et Y dans le même ObjectAnimator plutôt que d'en créer plusieurs, puis de toutes les ajouter dans un AnimatorSet?

Merci!

16
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 Un objetAnimateur

42
Hugo

Je pense que vous devriez utiliser un AnimationSet .. Il fait pratiquement ce que vous voulez et c'est la bonne façon de le faire car lorsque je pense à PropertyValuesHolder je ne pense pas à Images clés .

Donc voilà:

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();

Vous pouvez ajouter autant de ObjectAnimators que vous le souhaitez.

14

Si vous animez une vue (comme votre exemple le suggère), vous pouvez utiliser un ViewPropertyAnimator: 

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

L'animation de la vue pourrait être faite encore plus facilement:

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

(Dans cet extrait, ViewPropertyAnimator a été utilisé).

2
Andrey

Une approche alternative que j'ai utilisée pour ajouter plusieurs propriétés à l'animation d'un objet consiste à utiliser un mélange de code et de XML pour définir l'animation. Ceci est basé sur ceci documentation

Par exemple, en XML, je peux configurer AnimatorSets et ObjectAnimators pour un seul objet avec des valeurs statiques et définir une séquence séquentielle de modifications (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>

Ensuite, je peux charger ces AnimatorSets/ObjectAnimators au moment de l'exécution et modifier leurs valeurs avec des valeurs générées dynamiquement:

    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();
2
brif