Montag, 16. Dezember 2013

Android: Animationen verbinden

Nachdem ich im vorigen Post Gundlegendes zu Animationen in Android erklärt habe, möchte ich heute zeigen, wie man mit einem AnimatorSet mehrere Animationen verbindet und diese nacheinander oder miteinander abspielt.
Das Grundgerüst ist fast identisch zu dem aus dem vorigen Post, nur dieses Mal haben wir 2 TextViews, die nach Klick auf den Button animiert werden sollen:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Android.Animation;

namespace AnimationsExample
{
     [Activity (Label = "AnimationsExample", MainLauncher = true)]
     public class MainActivity : Activity
     {
          protected override void OnCreate (Bundle bundle)
          {
               base.OnCreate (bundle);

               LinearLayout Layout = new LinearLayout (this);
               Layout.Orientation = Orientation.Vertical;

               TextView TxtView1 = new TextView (this);
               TxtView1.Text = "I'm flying";
               Layout.AddView (TxtView1);

               TextView TxtView2 = new TextView (this);
               TxtView2.Text = "I'm flying 2";
               Layout.AddView (TxtView2);

               Button Btn1 = new Button (this);
               Btn1.Text = "Animation";
               Layout.AddView (Btn1);

               Btn1.Click += (object sender, EventArgs e) => {
                    // Animation
               };

               SetContentView (Layout);
          }
     }
}

Nun erstellen wir zuerst, wie im vorigen Post beschrieben, 2 Animationen vom Typ ObjectAnimator, welche jeweils ein TextView nach rechts verschieben:

ObjectAnimator Animator1 = ObjectAnimator.OfInt(TxtView1, "Left", 0, 100);
Animator1.SetDuration(1000);
ObjectAnimator Animator2 = ObjectAnimator.OfInt(TxtView2, "Left", 0, 100);
Animator2.SetDuration(1000);

Um dem Titel gerecht zu werden kommt nun ein Objekt vom Typ AnimatorSet ins Spiel. Von diesem rufen wir zuerst die Methode Play() auf, welche eine Animation als Parameter erwartet. Das Besondere an einem AnimationSet ist nun, dass weitere Animationen aufgerufen werden können. Wir hängen diese entweder durch Aufruf der Methode With() oder Before() an, die Animationen werden dann entweder zusammen mit der ersten Animation oder danach abgespielt. Wie bei einzelnen Animationen auch muss am Schluss Start() aufgerufen werden. Folgender Code bewegt zuerst das obere TextView nach rechts, dann das untere:

ObjectAnimator Animator1 = ObjectAnimator.OfInt(TxtView1, "Left", 0, 100);
Animator1.SetDuration(1000);
ObjectAnimator Animator2 = ObjectAnimator.OfInt(TxtView2, "Left", 0, 100);
Animator2.SetDuration(1000);
AnimatorSet Combined = new AnimatorSet();
Combined.Play(Animator1).Before(Animator2);
Combined.Start();

Zu beachten ist hierbei, dass nur 2 zeitliche Ebenen zur Verfügung stehen, der Aufruf Play(A1).Before(A2).Before(A3) würde also die beiden Animationen A2 und A3 zeitgleich nach Animation A1 abspielen. Soll die Verschachtelung tiefer gehen, müssen mehrere AnimatorSets verwendet werden oder die Funktion PlaySequentially(). Diese erwartet eine Liste mit Elementen vom Typ Grundtyp Animator (ihr können also einzelne Animationen oder ganze AnimatorSets übergeben werden) und spielt diese dann nacheinander ab.
Möchte man viele Animationen ordnen, ist außerdem die Funktionen PlayTogether() nützlich, welche ebenfalls eine Liste von Animationen erwartet und diese gleichzeitig abspielt.

Keine Kommentare:

Kommentar veröffentlichen