2015-02-05 8 views
10

Ho un'animazione piuttosto complessa ho bisogno di codice e sto usando un mazzo di ObjectAnimators come la seguente:Modificare più proprietà con un singolo ObjectAnimator?

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

E 'possibile raggruppare X e Y traduzioni nella stessa ObjectAnimator piuttosto che la creazione di un molti di loro poi aggiungendoli tutti in un AnimatorSet?

Grazie!

+0

invece di TRANSLATION_X/TRANSLATION_Y provare la vostra proprietà, che sia "myProperty" e vedere cosa succede – pskink

+0

I non posso farlo TRANSLATION_Y è solo una costante. In realtà è "translationY" che è la proprietà usata per tradurre lungo l'asse Y. Non riesco a crearne uno, almeno non credo di poterlo fare! –

+0

ok prova qualcosa del tipo: ObjectAnimator.ofFloat (questo, "miaProprietà", valore) – pskink

risposta

35
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 Uno ObjectAnimator

+0

Impressionante! Grazie per aver condiviso questo! –

+0

@TheHungryAndroider, dovresti aver accettato la risposta;) –

+0

@blipinsk, sebbene questa sia una risposta utile, sfortunatamente non ha risposto alla domanda ... –

3

Se si sta animando una vista (come il tuo esempio suggerisce), è possibile utilizzare un ViewPropertyAnimator:

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

Sarei in grado di aggiungere un ViewPropertyAnimator a un set? Qualcosa di simile ad un AnimatorSet? –

+0

Ho pensato che stavi cercando di evitare la creazione di un AnimatorSet. No non saresti in grado di aggiungerlo ad un AnimatorSet. Cosa stai cercando di ottenere? – Quanturium

+0

Non interamente, no. Quindi il mio AnimatorSet è usato per spostare un sacco di oggetti diversi, ma mi piacerebbe raggruppare le animazioni di ogni oggetto (traduzioni X/Y, scale, ecc.) In un singolo oggetto –

1
vista

Animazione potrebbe fare ancora più semplice:

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

(in questo snippet ViewProp ertyAnimator è stato utilizzato).

8

Penso che dovresti usare uno AnimationSet. Praticamente fa quello che vuoi ed è il modo migliore per farlo perché quando penso a PropertyValuesHolder non penso a Fotogrammi chiave.

Quindi sì:

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

È possibile aggiungere il numero ObjectAnimators come si desidera.

2

Un approccio alternativo che ho utilizzato per aggiungere più proprietà all'animazione di un oggetto consiste nell'utilizzare un mix di codice e XML per definire l'animazione. Questo si basa su questa documentation

Ad esempio, in XML posso AnimatorSets installazione e ObjectAnimators per un singolo oggetto con valori statici, e definire una sequenza sequenziale di modifiche (res/animatore/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> 

allora posso caricare questi AnimatorSets/ObjectAnimators in fase di esecuzione e modificare i loro valori con i valori generati in modo dinamico:

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