2016-05-23 6 views
1

In meinem Android-Projekt habe ich eine Button, die nach dem Klicken "animiert" werden soll (und versteckt bleiben). Der Effekt wird als ein in anim Ressourcen definierter AnimationsSet implementiert, den ich unter Verwendung von AnimationUtils lade. Um die Animation im letzten Frame einzufrieren, verwende ich setFillAfter(true).Android-Animation mit fillAfter auf True zurückgesetzt, nachdem irgendwo klicken

private Button button; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_temp); 
    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    if (v != button) return; 
    this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Animation animation = AnimationUtils.loadAnimation(button.getContext(), R.anim.out_to_back); 
      animation.setFillAfter(true); 
      button.startAnimation(animation); 
     } 
    }); 
} 

Die Animation Ressource selbst ist wie folgt definiert: geklickt

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" 
    android:fillAfter="true" 
    android:duration="400"> 
    <alpha 
     android:fromAlpha="1.0" 
     android:toAlpha="0.0" /> 
    <scale 
     android:fromXScale="1" 
     android:toXScale="0" 
     android:fromYScale="1" 
     android:toYScale="0" 
     android:pivotX="50%" 
     android:pivotY="50%" /> 
</set> 

Nachdem der Knopf wie erwartet belebt. Das Problem ist jedoch, dass die Animation zurückgesetzt wird, wenn ich irgendwo anders klicke. Eine einfache Demo:

Button fade-out animation being reset after clicking anywhere

Ist das ein Bug, oder bin ich etwas wirklich offensichtlich fehlt? Danke für irgendwelche Ideen!

Zusätzliche Informationen

  • es nicht, ob ich fillAfter im Code festgelegt ist egal, in der XML-Ressource oder beid
  • , wenn es in XML-Einstellung, es ist nicht, ob ich es egal anwenden auf das <set> Element oder auf beiden der einzelnen „Komponenten“ <alpha> und <scale>
  • die Vorschau auf einem Emulator ausgeführt API 16
  • geschieht dies nicht auf API 22
  • 012 eingefangen wurde,

PS: Ich bin mir bewusst, ich bin besser Animator verwenden, nicht die Animation APIs (es sei denn, ich Pre-Honeycomb Ziel müssen, was ich nicht tun) Ich bin wahrscheinlich werde Schalter auf Animator sowieso und Überprüfen Sie, ob dieses Verhalten weiterhin besteht. Aber ich bin gespannt, was hier überhaupt vor sich geht!

Antwort

1

Eine Sache, die Sie sofort ausprobieren können, ist das Attribut android:fillEnabled="true" in Ihrer Animation xml zusammen mit fillAfter. Ich bin mir nicht sicher, ob das helfen wird, aber ich weiß, dass es für einige Szenarien funktioniert hat.

Wenn das nicht funktioniert, besteht Ihre andere Möglichkeit darin, eine AnimationListener für Ihre Animation festzulegen und dann die Sichtbarkeit der Schaltfläche auf GONE einzustellen, sobald die Animation abgeschlossen ist. Dies wird es so machen, sobald das Ausblenden geschieht, wird die Schaltfläche aus der Ansicht entfernt, bis Sie sie wieder zurückholen. Es würde wie folgt aussehen:

Animation animation = AnimationUtils.loadAnimation(button.getContext(), R.anim.out_to_back); 
animation.setFillAfter(true); 
animation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { 

    } 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     button.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { 

    } 
}); 
button.startAnimation(animation); 

Es kann sich beschweren, dass Ihre button Variable nicht endgültig ist. Sie sollten das beheben können, indem Sie einfach die Ansicht, die durch Ihre onClick Methode zu einer lokalen endgültigen Variable, wie final View buttonView = v;

+0

kommt Danke für die Antwort! Ich habe vergessen zu erwähnen, dass fillEnabled nicht geholfen hat; Ich habe es vor nicht allzu langer Zeit gelesen: http://graphics-geek.blogspot.cz/2011/08/mysterious-behavior-of-fillbefore.html –

+0

Auch die Sichtbarkeit von GONE zu setzen war meine "Workaround" Lösung für ein paar Tage jetzt. Ich könnte mich daran gewöhnen, aber eine andere Sache, die ich nicht erwähnte, ist, dass ich mich in Xamarin/C# entwickle. Ich habe es nur in Java in einem separaten Android Studio-Projekt neu erstellt, um das Problem zu isolieren und es in eine Sprache einzufügen, die in Android gebräuchlicher ist.Und die Sache ist, es gibt keine solche "Inline-Interface-Implementierungen" in C#; meine gesamte Aktivität müsste von IAnimationListener übernommen werden, und diese bestimmte Aktivität ist schon ein Monster ... –

+1

Wie auch immer, deine Antwort enthält einige hilfreiche Tipps, daher der Upvote :) –