Ich möchte animierte GIF-Bilder in meiner Anwendung anzeigen. Wie ich auf die harte Tour herausgefunden habe, unterstützt Android animiertes GIF nicht nativ.
Allerdings kann es Animationen mit Anzeige AnimationDrawable :
Entwickeln> Anleitungen> Bilder und Grafiken> Drawables - Übersicht
Das Beispiel verwendet Animationen, die als Frames in Anwendungsressourcen gespeichert sind. Ich muss jedoch animiertes GIF direkt anzeigen.
Mein Plan ist es, animiertes GIF in Frames zu unterteilen und jedes Frame als zeichnbar zu AnimationDrawable hinzuzufügen.
Weiß jemand, wie man Frames aus animiertem GIF extrahiert und in Drawable konvertiert ?
java
android
animated-gif
Leonti
quelle
quelle
Antworten:
Android kann mithilfe der android.graphics.Movie-Klasse animierte GIFs dekodieren und anzeigen.
Dies ist nicht zu stark dokumentiert, befindet sich jedoch in der SDK-Referenz . Darüber hinaus wird es in Beispielen in ApiDemos im BitmapDecode- Beispiel mit einem animierten Flag verwendet.
quelle
setLayerType(LAYER_TYPE_SOFTWARE)
in Ihrer Ansicht. Aber es funktioniert immer noch nur für einige Gifs und für einige Geräte.Paint p = new Paint(); p.setAntiAlias(true); setLayerType(LAYER_TYPE_SOFTWARE, p);
hat funktioniert!AKTUALISIEREN:
Gleiten verwenden:
Verwendung:
siehe docs
quelle
auch put (main / assets / htmls / name.gif) [mit diesem HTML an die Größe anpassen]
Deklarieren Sie in Ihrer XML beispielsweise Folgendes (main / res / layout / name.xml): [Sie definieren beispielsweise die Größe]
Fügen Sie in Ihrer Aktivität den nächsten Code in onCreate ein
Wenn Sie dynamisch laden möchten, müssen Sie die Webansicht mit Daten laden:
Vorschlag: Laden Sie GIF besser mit statischen Bildern. Weitere Informationen finden Sie unter https://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
Das war's, ich hoffe du hilfst.
quelle
Ich habe das Problem gelöst, indem ich GIF- Animationen in Frames aufgeteilt habe, bevor ich sie auf dem Telefon gespeichert habe, damit ich mich in Android nicht darum kümmern muss.
Dann lade ich jeden Frame auf das Telefon herunter, erstelle daraus Drawable und erstelle dann AnimationDrawable - sehr ähnlich dem Beispiel aus meiner Frage
quelle
Ich habe einen sehr einfachen Weg gefunden, mit einem schönen und einfachen Arbeitsbeispiel hier
animiertes Widget anzeigen
Bevor es funktioniert, müssen im Code einige Änderungen vorgenommen werden
IM FOLGENDEN
einfach ersetzen
im
UND IN
Stellen Sie Ihre eigene GIF-Animationsdatei bereit
ERSETZEN SIE DIE ERSTE LINIE IN
nach dem Namen der Klasse ...
Nach diesen kleinen Änderungen sollte es wie bei mir funktionieren ...
Ich hoffe das hilft
quelle
Möglichkeiten, animiertes GIF auf Android anzuzeigen:
https://github.com/koral--/android-gif-drawable - Der Decoder ist in C implementiert und daher sehr effizient.
https://code.google.com/p/giffiledecoder - Der Decoder ist in Java implementiert, sodass die Arbeit einfacher ist. Selbst bei großen Dateien immer noch einigermaßen effizient.
Sie finden auch viele Bibliotheken, die auf der GifDecoder-Klasse basieren. Das ist auch ein Java-basierter Decoder, aber er lädt die gesamte Datei in den Speicher, sodass er nur für kleine Dateien gilt.
quelle
Es fiel mir wirklich schwer, animiertes GIF in Android zu haben. Ich hatte nur zwei Arbeiten:
WebView funktioniert einwandfrei und ist sehr einfach. Das Problem ist jedoch, dass die Ansicht langsamer geladen wird und die App etwa eine Sekunde lang nicht reagiert. Ich mochte das nicht. Also habe ich verschiedene Ansätze ausprobiert (NICHT ARBEITEN):
Ich hatte einige hin und her mit
Ion
; Endlich habe ich es geschafft und es ist wirklich schnell :-)quelle
Gleiten 4.6
1. Gif laden
2. Um das Dateiobjekt abzurufen
quelle
Glide
Image Loader Library für Android, empfohlen von Google.
Was dieser Glide hat, aber Picasso nicht
Die Möglichkeit, GIF-Animationen in eine einfache ImageView zu laden, ist möglicherweise die interessanteste Funktion von Glide. Und ja, das geht mit Picasso nicht. Einige wichtige Links-
quelle
Verwenden Sie ImageViewEx , eine Bibliothek, die die Verwendung eines Gifs so einfach macht wie die Verwendung eines
ImageView
.quelle
Versuchen Sie dies, GIF-Datei mit der folgenden Code-Anzeige in der Fortschrittsleiste
load_activity.xml (im Ordner Layout)
custom_loading.xml (im zeichnbaren Ordner)
hier lege ich black_gif.gif (in zeichnbaren Ordner), hier kannst du dein eigenes gif einfügen
LoadingActivity.java (im res-Ordner)
quelle
Niemand hat die Ion- oder Glide- Bibliothek erwähnt. Sie arbeiten sehr gut.
Es ist einfacher zu handhaben als ein WebView.
quelle
Ich hatte Erfolg mit der in diesem Artikel vorgeschlagenen Lösung , einer Klasse namens
GifMovieView
, die eine rendert,View
die dann angezeigt oder einer bestimmten hinzugefügt werden kannViewGroup
. Schauen Sie sich die anderen Methoden an, die in Teil 2 und 3 des angegebenen Artikels vorgestellt werden.Der einzige Nachteil dieser Methode ist, dass das Antialiasing des Films nicht so gut ist (muss ein Nebeneffekt bei der Verwendung der "zwielichtigen" Android-
Movie
Klasse sein). Sie sollten den Hintergrund in Ihrem animierten GIF besser auf eine Volltonfarbe einstellen.quelle
Einige Gedanken über das BitmapDecode Beispiel ... Im Grunde verwendet es die alten, sondern eher gesichtsFilmKlasse von android.graphics. In neueren API-Versionen müssen Sie die Hardwarebeschleunigung wie hier beschrieben deaktivieren . Ansonsten war es für mich ein Segfault.
Hier ist das BitmapDecode-Beispiel, das nur mit dem GIF-Teil gekürzt wurde. Sie müssen Ihr eigenes Widget (Ansicht) erstellen und es selbst zeichnen. Nicht ganz so leistungsfähig wie ein ImageView.
In diesem schönen Tutorial finden Sie zwei weitere Methoden, eine mit ImageView und eine andere mit WebView . Die ImageView-Methode verwendet die Apache-lizenzierte Android-Gifview von Google Code.
quelle
@PointerNull gab eine gute Lösung, aber es ist nicht perfekt. Es funktioniert nicht auf einigen Geräten mit großen Dateien und zeigt fehlerhafte Gif-Animationen mit Delta-Frames in der Vor-ICS-Version. Ich habe eine Lösung ohne diese Fehler gefunden. Es ist eine Bibliothek mit nativer Dekodierung zum Zeichnen: Korals Android-GIF-Zeichnen .
quelle
Wenn Sie es in eine WebView einfügen, muss es korrekt angezeigt werden können, da der Standardbrowser GIF-Dateien unterstützt. (Froyo +, wenn ich mich nicht irre)
quelle
Es gibt zwei Möglichkeiten, animierte Gifs in unsere Android-Apps zu laden
1) Verwenden Sie Glide , um das GIF in ein zu laden
ImageView
.2) Verwenden Sie ein HTML, um das GIF in ein zu laden
WebView
Erstellen Sie den HTML-Code mit der Adresse der GIF-Datei:
Speichern Sie diese Datei im Assets-Verzeichnis:
Das Laden dieses HTML in die WebView Ihrer Anwendung:
Hier ist ein vollständiges Beispiel für diese beiden Optionen .
quelle
Nur für Android API (Android Pie) 28 und +
Verwenden Sie AnimatedImageDrawable alsXML-Code, fügen Sie eine ImageView hinzu
AnimatedImageDrawable
ist ein Kind von Drawable und erstellt vonImageDecoder.decodeDrawable
ImageDecoder.decodeDrawable
was weiter die Instanz vonImageDecoder.Source
erstellt von erforderlichImageDecoder.createSource
.ImageDecoder.createSource
Quelle kann nur als Name, ByteBuffer, Datei, Ressourcen-ID, URI, ContentResolver zum Erstellen des Quellobjekts verwendet werden und zum ErstellenAnimatedImageDrawable
alsDrawable
(polymorpher Aufruf) verwendet werden.Hinweis: Sie können auch
Bitmap
mit ImageDecoder # decodeBitmap erstellen .Ausgabe:
AnimatedDrawable unterstützt auch die Größenänderung, Rahmen- und Farbmanipulation
quelle
Ich denke, die bessere Bibliothek für den Umgang mit GIF- Dateien ist diese: von Koral
Ich habe es benutzt und bin erfolgreich und diese Bibliothek ist GIF'S gewidmet. aber wo als Picasso und Gleiten Allzweck- Bildrahmen sind ; Ich denke, die Entwickler dieser Bibliothek haben sich ganz auf GIF-Dateien konzentriert
quelle
Verwenden Sie Fresko. So geht's:
http://frescolib.org/docs/animations.html
Hier ist das Repo mit dem Beispiel:
https://github.com/facebook/fresco/tree/master/samples/animation
Achtung, Fresko unterstützt keine Wrap-Inhalte!
quelle
Ich wollte nur hinzufügen, dass die Movie- Klasse jetzt veraltet ist.
Es wird empfohlen, dies zu verwenden
AnimatedImageDrawable
quelle
Erstellen Sie ein Paket mit dem Namen "Utils" im Ordner "src" und erstellen Sie eine Klasse mit dem Namen "GifImageView".
Definieren Sie nun GifImageView in der MainActivity-Datei: src / activity / MainActivity.class
Jetzt UI-Teiledatei: res / layout / activity_main.xml
Ressourcencode: Android-Beispiel
quelle
Zunächst sollte der Android-Browser animierte GIFs unterstützen. Wenn nicht, dann ist es ein Fehler! Schauen Sie sich die Issue-Tracker an.
Wenn Sie diese animierten GIFs außerhalb eines Browsers anzeigen, ist dies möglicherweise eine andere Geschichte. Um das zu tun, was Sie verlangen, benötigen Sie eine externe Bibliothek, die die Dekodierung von animierten GIFs unterstützt.
Die erste Anlaufstelle wäre ein Blick auf die Java2D- oder JAI-API (Java Advanced Imaging), obwohl ich sehr überrascht wäre, wenn Android Dalvik diese Bibliotheken in Ihrer App unterstützen würde.
quelle
Ähnlich wie @Leonti, aber mit etwas mehr Tiefe:
Um dasselbe Problem zu lösen, habe ich GIMP geöffnet, alle Ebenen bis auf eine ausgeblendet, als eigenes Bild exportiert und dann diese Ebene ausgeblendet und die nächste usw. ausgeblendet, bis ich für jede einzelne Ressourcendatei hatte . Dann könnte ich sie als Frames in der XML-Datei AnimationDrawable verwenden.
quelle
Ich habe dies gelöst, indem ich GIF in Frames aufgeteilt und Standard-Android-Animationen verwendet habe
quelle
Etwas, das ich getan habe, um Gifs in Apps anzuzeigen. Ich habe ImageView erweitert, damit Benutzer die Attribute frei verwenden können. Es kann Gifs von der URL oder aus dem Assets-Verzeichnis anzeigen. Die Bibliothek erleichtert auch das Erweitern von Klassen, um von ihr zu erben, und das Erweitern, um verschiedene Methoden zum Initialisieren des GIF zu unterstützen.
https://github.com/Gavras/GIFView
Es gibt eine kleine Anleitung auf der Github-Seite.
Es wurde auch auf Android Arsenal veröffentlicht:
https://android-arsenal.com/details/1/4947
Anwendungsbeispiel:
Aus XML:
In der Aktivität:
Programmgesteuertes Einstellen des GIF:
quelle
Einfachster Weg - Kann den folgenden Code berücksichtigen
Wir können Imageview setImageResource nutzen, siehe unten Code für das gleiche.
Der folgende Code kann verwendet werden, um das Bild wie GIF-Incase anzuzeigen, wenn Sie das mehrfach geteilte Bild von GIF haben. Teilen Sie das GIF einfach über ein Online-Tool in ein einzelnes PNG auf und fügen Sie das Bild wie in der folgenden Reihenfolge in das Zeichenelement ein
image_1.png, image_2.png usw.
Lassen Sie den Handler das Bild dynamisch ändern.
quelle
Die einfache Möglichkeit, animiertes GIF direkt von der URL in Ihr App-Layout anzuzeigen, ist die Verwendung der WebView-Klasse.
Schritt 1: In Ihrem Layout XML
Schritt 2: In Ihrer Aktivität
Schritt 3: Machen Sie in Ihrer Manifest.XML die Internetberechtigung
Schritt 4: Falls Sie Ihren GIF-Hintergrund transparent machen und GIF an Ihr Layout anpassen möchten
quelle
Sie können die GifAnimationDrawable-Bibliothek verwenden, die Sie unter diesem Link finden - https://github.com/Hipmob/gifanimateddrawable - und die jedes GIF in AnimationDrawable konvertieren. Genießen :)
quelle
quelle