Einführung in diesen Abschnitt:
Beginnen wir mit diesem Abschnitt und erkunden wir die Animationen in Android. Schließlich wird das Hinzufügen einiger Animationen zur APP unsere Anwendung noch beeindruckender machen, z. B. die einfachste Möglichkeit, die Aktivität ein- und auszuschalten. Natürlich sind benutzerdefinierte Steuerungsanimationen auf jeden Fall unerlässlich ~ Die Animation in Android ist in drei Kategorien unterteilt: Frame-by-Frame-Animation (Frame) und Tween-Animation (Tween) sowie Eigenschaftsanimation (Property) , die nach Android 3.0 eingeführt wurde . In diesem Abschnitt finden Sie die erste Kategorie. Animation - eine grundlegende Verwendung der Frame-by-Frame-Animation~
1. Konzept und Verwendung der Frame-Animation
Die Rahmenanimation ist sehr einfach zu verstehen. Tatsächlich wird sie einfach aus N statischen Bildern zusammengestellt, und dann zeigen wir diese Bilder nacheinander durch Steuerung an. Aufgrund des „visuellen Rests“ des menschlichen Auges wird dies zu einer „Illusion“ führen " der Animation, und spielen Sie den Film ab. Das Prinzip ist das gleiche!
Um eine Frame-Animation in Android zu implementieren, verwenden wir im Allgemeinen ein zuvor erläutertes Drawable: AnimationDrawable schreibt zuerst das Drawable und ruft dann start() und stop() im Code auf, um die Wiedergabe der Animation zu starten oder zu stoppen
Natürlich können wir auch Frame-für-Frame-Animationen in Java-Code erstellen, AnimationDrawable-Objekte erstellen und dann addFrame (Drawable Frame, Int Duration) aufrufen, um Frames zur Animation hinzuzufügen, und dann start () und stop () ~ aufrufen
Schreiben wir zwei Beispiele, um die Wirkung der nächsten Frame-Animation zu erleben und uns mit der Verwendung vertraut zu machen
2. Anwendungsbeispiel:
Beispiel 1: Das einfachste Beispiel :
Laufeffektdiagramm :
Code-Implementierung :
Schreiben Sie zuerst unsere Animationsdatei, ganz einfach, erstellen Sie zuerst ein Animationsverzeichnis unter res und starten Sie dann unsere Animationsdatei: miao_gif.xml : Hier wird mit android:oneshot festgelegt, ob die Animation nur einmal abgespielt wird, true nur einmal abgespielt wird, false Schleife !
<?xml version="1.0"kodierung="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <Artikel android:drawable="@mipmap/img_miao1" android:duration="80" /> <Artikel android:drawable="@mipmap/img_miao2" android:duration="80" /> <Artikel android:drawable="@mipmap/img_miao3" android:duration="80" /> <!--Auf Platz beschränkt, andere Elemente weglassen, selbst erfinden--> ... </animation-list>
Gehen Sie mit der Animationsdatei zu unserer Layoutdatei: activity_main.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Schaltfläche android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" /> <Schaltfläche android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="stop" /> <ImageView android:id="@+id/img_show" android:layout_width="120dp" android:layout_height="120dp" android:layout_gravity="center" android:background="@anim/miao_gif" /> </LinearLayout>
Schließlich steuert unsere MainActivity.java hier den Start und die Pause der Animation:
Die öffentliche Klasse MainActivity erweitert AppCompatActivity und implementiert View.OnClickListener { privater Button btn_start; privater Button btn_stop; private ImageView img_show; private AnimationZeichnbare Animation; @Override protected void onCreate(Bundle savingInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); anim = (AnimationDrawable) img_show.getBackground(); } private void bindViews() { btn_start = (Button) findViewById(R.id.btn_start); btn_stop = (Button) findViewById(R.id.btn_stop); img_show = (ImageView) findViewById(R.id.img_show); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { Fall R.id.btn_start: anim.start(); brechen; Fall R.id.btn_stop: anim.stop(); brechen; } } }
OK, es ist ganz einfach~
Beispiel 2: Frame-Animation an einer bestimmten Stelle abspielen
Laufeffektdiagramm :
Code-Implementierung :
Laden Sie dennoch zuerst unsere Animationsdatei hoch: anim_zhuan.xml :
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true"> <Artikel android:drawable="@mipmap/img_zhuan1" android:duration="80" /> <Artikel android:drawable="@mipmap/img_zhuan2" android:duration="80" /> <Artikel android:drawable="@mipmap/img_zhuan3" android:duration="80" /> <!--Auf Platz beschränkt, andere Elemente weglassen, selbst erfinden--> ... </animation-list>
Als nächstes schreiben wir eine benutzerdefinierte ImageView: FrameView.java , in der der aktuell abgespielte Frame durch Reflektion ermittelt wird und ob es sich um den letzten Frame handelt. Wenn ja, blenden Sie das Steuerelement aus!
/** * Erstellt von Jay am 15.11.2015 0015. */ Die öffentliche Klasse FrameView erweitert ImageView { private AnimationZeichnbare Animation; public FrameView(Context context) { super(Kontext); } public FrameView(Context context, AttributeSet attrs) { super(context, attrs); } public FrameView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setAnim(AnimationDrawable anim){ this.anim = anim; } public void setLocation(int top,int left){ this.setFrame(left,top,left + 200,top + 200); } @Override protected void onDraw(Canvas Canvas) { versuchen{ // Reflection ruft den mCurFrame-Wert in AnimationDrawable auf Feld field = AnimationDrawable.class .getDeclaredField("mCurFrame"); field.setAccessible(true); int curFrame = field.getInt(anim);// Holen Sie sich den aktuellen Frame der Animationsanimation if (curFrame == anim.getNumberOfFrames() - 1)// Wenn es den letzten Frame erreicht hat { //Die Ansicht ausblenden lassen setVisibility(View.INVISIBLE); } }catch (Ausnahme e){e.printStackTrace();} super.onDraw(canvas); } }
Schließlich erstellt unsere MainActivity.java ein FrameLayout, fügt eine Ansicht hinzu, verarbeitet das im Touch-Ereignis gedrückte Ereignis, zeigt das Steuerelement an und startet die Animation~
Die öffentliche Klasse MainActivity erweitert AppCompatActivity { private FrameView fView; private AnimationDrawable anim = null; @Override protected void onCreate(Bundle savingInstanceState) { super.onCreate(savedInstanceState); FrameLayout fly = new FrameLayout(this); setContentView(fly); fView = new FrameView(this); fView.setBackgroundResource(R.anim.anim_zhuan); fView.setVisibility(View.INVISIBLE); anim = (AnimationDrawable) fView.getBackground(); fView.setAnim(anim); fly.addView(fView); fly.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Legt den Animationseffekt beim Drücken fest if(event.getAction() == MotionEvent.ACTION_DOWN){ anim.stop(); float x = event.getX(); float y = event.getY(); fView.setLocation((int) y - 40,(int)x-20); //Anzeigeposition anzeigen fView.setVisibility(View.VISIBLE); anim.start(); //Starte die Animation } falsch zurückgeben; } }); } }