2013-03-09 5 views
5

ich einen Satz von zwei Animationen haben, laufen beide Animationen zusammen, um den Interpolator Überschwinger mitAndroid Ist es möglich, gleichzeitige Interpolatoren zu verwenden?

<?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> 

Ich möchte die translate Animation überschreiten, und die scale Animation zu beschleunigen.
Ich habe versucht, dies zu tun, aber es funktioniert nicht:

<?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> 

Es scheint, als ob nur ein Interpolator zu einem bestimmten Zeitpunkt für alle Animationen aktiv sein kann, auf ein einzelnes Objekt durchgeführt wird.

Antwort

3

Ich spalte die Animationen und legte eine auf eine ImageView und die andere auf eine RelativeLayout, die die Bildansicht enthielt.

Übersetzer

<?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> 

Und der Quellcode es anstiften:

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

Ich dachte, es sah ziemlich gut aus. Ich bin mir nicht sicher, welchen Effekt du erhofft hast.

9

Dies ist nur raten Arbeit. Ich erinnere mich, dass einer der Konstruktoren AnimationSet ein Argument nehmen kann, nämlich shareInterpolator.

Nach dem Namen des Parameters zu beurteilen, sollte dies wahrscheinlich in Ihrem Fall auf false gesetzt werden. Im Moment sollte es den Standard "Wert" verwenden. Dieser Standardwert ist höchstwahrscheinlich true, da Ihre Animationen keine unterschiedlichen Interpolatoren haben, obwohl Sie für jeden einen anderen Wert angegeben haben.

Um zu bestätigen, der Quellcode AnimationSet die folgende Zeile einen Wert für shareInterpolator (von xml) zuweisen:

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

Anschaulich bedeutet dies, dass, wenn diese boolean nicht angegeben ist, auf true ausfällt .


Lösung

Ihr Problem zu beheben, nehme ich Sie es mit dieser "R.styleable.AnimationSet_shareInterpolator" angeben sollte. Dies bedeutet lediglich Zugabeandroid:shareInterpolator="false"auf Ihre<set>Elemente

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>