2013-03-09 8 views
5

Ho una serie di due animazioni, entrambe le animazioni correre insieme con il superamento interpolatoreAndroid È possibile utilizzare gli interpolatori simultanei?

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/overshoot_interpolator" > 

    <translate 
     android:duration="6000" 
     android:fromXDelta="100%" android:toXDelta="0%" /> 

    <scale 
     android:duration="6000" 
     android:fromXScale="1.0" android:toXScale="0.6" 
     android:pivotX="0" 
     android:fromYScale="1.0" android:toYScale="1.0" 
     android:repeatCount="1" 
     android:repeatMode="reverse" /> 
</set> 

voglio l'animazione translate di overshoot, e l'animazione scale per accelerare.
Ho cercato di fare questo, ma non funziona:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <translate 
     android:interpolator="@android:anim/overshoot_interpolator" 
     android:duration="6000" 
     android:fromXDelta="100%" android:toXDelta="0%" /> 

    <scale 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:duration="6000" 
     android:fromXScale="1.0" android:toXScale="0.6" 
     android:pivotX="0" 
     android:fromYScale="1.0" android:toYScale="1.0" 
     android:repeatCount="1" 
     android:repeatMode="reverse" /> 
</set> 

Sembra che solo un interpolatore può essere attivo in un dato momento per tutte le animazioni essendo eseguita su un singolo oggetto.

risposta

3

Ho messo le animazioni divise e ne ho messo uno su un ImageView e l'altro su un RelativeLayout che conteneva la vista immagine.

traduttore

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 

    <translate 
      android:interpolator="@android:anim/overshoot_interpolator" 
      android:duration="6000" 
      android:fromXDelta="100%" android:toXDelta="0%" /> 

</set> 

Scalor

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <scale 
      android:interpolator="@android:anim/accelerate_interpolator" 
      android:duration="6000" 
      android:fromXScale="1.0" android:toXScale="0.6" 
      android:pivotX="0" 
      android:fromYScale="1.0" android:toYScale="1.0" 
      android:repeatCount="1" 
      android:repeatMode="reverse" /> 
</set> 

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/previousItem" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_alignParentLeft="true" 
        android:onClick="goToPreviousItem" 
        android:layout_margin="@dimen/float_from_edges" 
        android:layout_width="wrap_content" 
      > 
     <ImageView android:id="@+id/previousItemArrow" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="@drawable/arrow_left" 
       /> 
    </RelativeLayout> 

e il codice sorgente per istigare esso:

RelativeLayout previousItemButton = (RelativeLayout)findViewById(R.id.previousItem); 
    ImageView myButton = (ImageView)findViewById(R.id.previousItemArrow); 
    Animation translator = 
      AnimationUtils.loadAnimation(this, R.anim.translator); 
    myButton.startAnimation(translator); 

    Animation scalor = 
      AnimationUtils.loadAnimation(this, R.anim.scalor); 
    previousItemButton.startAnimation(scalor); 

Ho pensato che fosse abbastanza buono. Non sono sicuro di quale effetto stavi sperando.

9

Questo è solo un lavoro da indovinare. Ricordo che uno dei costruttori di AnimationSet può prendere una discussione, ovvero shareInterpolator.

Giudicando dal nome del parametro, questo probabilmente dovrebbe essere impostato su false nel tuo caso. Al momento, dovrebbe usare il "valore" predefinito. Molto probabilmente questo valore predefinito è true perché le animazioni non hanno interpolatori diversi, sebbene ne sia stata specificata una diversa per ciascuna.

A conferma, il codice sorgente del AnimationSet ha la seguente riga per assegnare un valore per shareInterpolator (da XML):

setFlag(PROPERTY_SHARE_INTERPOLATOR_MASK, 
     a.getBoolean(com.android.internal.R.styleable.AnimationSet_shareInterpolator 
      , true)); 

Questo significa chiaramente che se questo booleano non è specificato, questo verrà impostato a true .


Soluzione

Per risolvere il problema, suppongo è necessario specificare che usando questo "R.styleable.AnimationSet_shareInterpolator". Questo significa semplicemente aggiungendoandroid:shareInterpolator="false"ai tuoi<set>elementi

1
This xml works with both interpolators check this 


<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shareInterpolator="false"> 

    <translate 
     android:interpolator="@android:anim/overshoot_interpolator" 
     android:fromXDelta="100%" android:toXDelta="0%" 
     android:duration="500" /> 

    <scale 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:fromXScale="1.0" android:toXScale="0.6" 
     android:pivotX="0" 
     android:fromYScale="1.0" android:toYScale="1.0" 
     android:repeatCount="1" 
     android:repeatMode="reverse" 
     android:startOffset="500" 
     android:duration="1000" /> 
</set>