View
s und Drawable
für animierte GIFs in Android an.
Die über JNI gebündelte GIFLib wird zum Rendern von Frames verwendet. Dieser Weg sollte effizienter sein als WebView
oder Movie
-Klassen.
Fügen Sie die folgende Abhängigkeit in build.gradle
Datei Ihres Projekts ein.
Abhängigkeiten { Implementierung 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Beachten Sie, dass das zentrale Maven-Repository definiert werden sollte, z. in build.gradle
obersten Ebene wie folgt:
Buildscript { Repositories { mavenCentral() } } alle Projekte { Repositories { mavenCentral() } }
Aktuelle Entwicklungs-Builds (Build aus dev
) werden im OSS-Snapshot-Repository veröffentlicht. Um sie zu verwenden, geben Sie die Repository-URL im repositories
Block an:
Repositories { mavenCentral() maven { URL „https://oss.sonatype.org/content/repositories/snapshots“ } } Abhängigkeiten { Implementierung 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<Abhängigkeit> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>hier die neueste Version einfügen</version> <type>aar</type> </Abhängigkeit>
Siehe Beispiel-Eclipse-Projekt mit Einrichtungsanweisungen.
Neueste Release-Downloads
Android 4.2+ (API-Level 17+)
für das hardwarebeschleunigte Rendering GifTextureView
für GifTexImage2D
OpenGL ES 2.0+
Android NDK wurde zum Kompilieren nativer Quellen benötigt
Siehe sample
. Beispielprojekt ist im Aufbau. Es sind noch nicht alle Funktionen abgedeckt.
Der einfachste Weg besteht darin GifImageView
(oder GifImageButton
) wie ein normales ImageView
zu verwenden:
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
Wenn von android:src
und/oder android:background
deklarierte Drawables GIF-Dateien sind, werden sie automatisch als GifDrawable
s erkannt und animiert. Wenn es sich bei dem angegebenen Drawable nicht um ein GIF handelt, funktionieren die genannten Ansichten wie einfaches ImageView
und ImageButton
.
GifTextView
können Sie GIFs als zusammengesetzte Zeichenelemente und Hintergrund verwenden.
<pl.droidsonroids.gif.GifTextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:drawableTop="@drawable/left_anim"android:drawableStart="@drawable/left_anim"android:background="@drawable/bg_anim "/>
GifImageView
, GifImageButton
und GifTextView
sind auch Hooks für Setter implementiert. Animierte GIFs können also durch Aufruf von setImageResource(int resId)
und setBackgroundResource(int resId)
festgelegt werden.
GifDrawable
kann direkt aus verschiedenen Quellen erstellt werden:
//asset fileGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //resource (drawable oder raw)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //kann null sein für Datei:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//byte arraybyte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //file pathGifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //fileFile gifFile = new File(getFilesDir(),"anim.gif");GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream (es muss Markierung unterstützen)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //direct ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
InputStreams werden im Finalizer automatisch geschlossen, wenn GifDrawable nicht mehr benötigt wird, sodass Sie sie nicht explizit schließen müssen. Durch den Aufruf recycle()
wird auch die zugrunde liegende Eingabequelle geschlossen.
Beachten Sie, dass alle Eingabequellen in der Lage sein müssen, zum Anfang zurückzuspulen. Es ist erforderlich, animierte GIFs korrekt abzuspielen (wobei die Animation wiederholbar ist), da nachfolgende Frames bei Bedarf von der Quelle dekodiert werden.
GifDrawable
implementiert ein Animatable
und MediaPlayerControl
sodass Sie dessen Methoden und mehr verwenden können:
stop()
– stoppt die Animation, kann von jedem Thread aus aufgerufen werden
start()
– startet die Animation, kann von jedem Thread aus aufgerufen werden
isRunning()
– gibt zurück, ob die Animation gerade läuft oder nicht
reset()
– spult die Animation zurück, startet die gestoppte Animation nicht neu
setSpeed(float factor)
– legt den neuen Animationsgeschwindigkeitsfaktor fest, z. Das Übergeben von 2.0f verdoppelt die Animationsgeschwindigkeit
seekTo(int position)
– sucht die Animation (innerhalb der aktuellen Schleife) an einer bestimmten position
(in Millisekunden)
getDuration()
– gibt die Dauer einer Schleife der Animation zurück
getCurrentPosition()
– gibt die verstrichene Zeit vom Beginn einer aktuellen Animationsschleife zurück
Standardsteuerelemente für einen MediaPlayer (wie in VideoView) können verwendet werden, um GIF-Animationen zu steuern und ihren aktuellen Fortschritt anzuzeigen.
Legen Sie GifDrawable
einfach wie folgt als MediaPlayer auf Ihrem MediaController fest:
@Overrideprotected void onCreate(Bundle savingInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(this) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mc.show(); } }); }
getLoopCount()
– gibt einen Schleifenzähler zurück, wie in der NETSCAPE 2.0
Erweiterung definiert
getNumberOfFrames()
– gibt die Anzahl der Frames zurück (mindestens 1)
getComment()
– gibt Kommentartext zurück ( null
, wenn GIF keinen Kommentar hat)
getFrameByteCount()
– gibt die minimale Anzahl von Bytes zurück, die zum Speichern von Pixeln des einzelnen Frames verwendet werden können
getAllocationByteCount()
– gibt die Größe (in Bytes) des zugewiesenen Speichers zurück, der zum Speichern von Pixeln eines bestimmten GifDrawable verwendet wird
getInputSourceByteCount()
– gibt die Länge (in Bytes) der unterstützenden Eingabedaten zurück
toString()
– gibt menschenlesbare Informationen über die Bildgröße und die Anzahl der Frames zurück (für Debugging-Zwecke gedacht)
GifDrawable
Instanz mit mehreren View
s Normalerweise wird eine einzelne GifDrawable
Instanz, die mehreren View
zugeordnet ist, nur auf der letzten animiert. Um dieses Problem zu lösen, erstellen Sie eine MultiCallback
Instanz, fügen Sie View
s hinzu und legen Sie den Rückruf für das angegebene Drawable fest, z. B.:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
Beachten Sie, dass, wenn Sie ein Drawable von z. B. ImageView
ändern, der Rückruf vom vorherigen Drawable entfernt wird. Danach müssen Sie den Rückruf neu zuweisen, sonst stoppt dieselbe GifDrawable
-Instanz die Animation. Weitere Informationen finden Sie unter #480.
recycle()
– wird bereitgestellt, um die Speicherfreigabe zu beschleunigen (wie in android.graphics.Bitmap
)
isRecycled()
– prüft, ob Drawable recycelt wird
getError()
– gibt Details zum letzten Fehler zurück
Die minimale API-Stufe beträgt jetzt 17 (Android 4.2). armeabi
(arm v5 und v6) wird nicht mehr unterstützt.
Die minimale API-Stufe beträgt jetzt 14 (Android 4.0).
Nur sinnvoll, wenn Consumer-Proguard-Regeln (im Paket mit der Bibliothek) nicht verwendet werden (sie werden standardmäßig von Gradle verwendet).
Die Proguard-Regel wurde in -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
geändert.
1.1.17 ist die letzte Version, die API Level 8 (Froyo) unterstützt. Ab 1.2.0 beträgt die minimale API-Stufe 9 (Gingerbread).
Die Behandlung mehrerer Randfälle wurde geändert:
GifDrawable#getNumberOfFrames()
gibt jetzt 0 zurück, wenn GifDrawable
recycelt wird
Die im Ergebnis von GifDrawable#toString()
enthaltenen Informationen, wenn GifDrawable
recycelt wird, enthalten jetzt nur noch Nullen
Es wird empfohlen (aber nicht erforderlich), LibraryLoader.initialize()
vor der Verwendung GifDrawable
aufzurufen. In einigen Fällen ist Context
erforderlich, wenn native Bibliotheken nicht normal extrahiert werden können. Weitere Informationen finden Sie unter ReLinker. Wenn LibraryLoader.initialize()
nicht aufgerufen wurde und das normale Laden der Bibliothek fehlschlägt, wird versucht, Context
auf eine alternative Weise abzurufen, was möglicherweise nicht immer funktioniert.
int
-Parameter loopNumber
wurde zu AnimationListener#onAnimationCompleted()
hinzugefügt.
Die Proguard-Konfiguration ist jetzt mit der Bibliothek gebündelt, Sie müssen sie nicht selbst angeben.
Das XML-Attribut src
in GifTextureView
wurde in gifSource
umbenannt, um mögliche Konflikte mit anderen Bibliotheken zu vermeiden.
Die Proguard-Konfiguration wurde geändert in:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
verwendet jetzt android.graphics.Bitmap
als Framepuffer. Der Versuch, auf Pixel (einschließlich Zeichnung) von recyceltem GifDrawable
zuzugreifen, führt wie in Bitmap
zu IllegalStateException
.
Die minimale API-Stufe beträgt jetzt 8 (Android 2.2).
Das Rendern erfolgt im Hintergrund-Thread, der unabhängig vom Haupt-Thread läuft, sodass die Animation auch dann läuft, wenn Drawable nicht gezeichnet wird. Das Rendern wird jedoch nicht ausgeführt, wenn Drawable nicht sichtbar ist, siehe [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). Diese Methode kann verwendet werden, um die Sichtbarkeit von Zeichenobjekten zu steuern, wenn sie nicht bereits vom Android-Framework verwaltet wird.
Diese Bibliothek verwendet Code von GIFLib 5.1.3 und SKIA.
ImageFactory
NativeScript-Plugin von Brad Martin verfügbar auf NPM
Sketch Leistungsstarker und umfassender Bildlader für Android mit Unterstützung für GIF, Gestenzoomen und Blockanzeige für supergroße Bilder.
Möchten Sie Ihr Projekt hier einbinden? Füllen Sie ein Problem
MIT-Lizenz
Siehe LICENSE-Datei.