View
s et Drawable
pour les GIF animés sous Android.
GIFLib fourni via JNI est utilisé pour restituer les images. Cette méthode devrait être plus efficace que les classes WebView
ou Movie
.
Insérez la dépendance suivante dans le fichier build.gradle
de votre projet.
dépendances { implémentation 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Notez que le référentiel central Maven doit être défini, par exemple. dans build.gradle
de niveau supérieur comme ceci :
script de construction { dépôts { mavenCentral() } } tous les projets { dépôts { mavenCentral() } }
Les versions de développement actuelles (construites à partir de la branche dev
) sont publiées dans le référentiel d'instantanés OSS. Pour les utiliser, spécifiez l'URL du référentiel dans le bloc repositories
:
dépôts { mavenCentral() maven {url "https://oss.sonatype.org/content/repositories/snapshots" } } dépendances { implémentation 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<dépendance> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>insérer la dernière version ici</version> <type>aar</type> </dépendance>
Voir Exemple de projet Eclipse avec instructions de configuration.
Téléchargements de la dernière version
Android 4.2+ (niveau API 17+)
pour le rendu accéléré par le matériel GifTextureView
pour GifTexImage2D
OpenGL ES 2.0+
Android NDK nécessaire pour compiler les sources natives
Voir sample
de répertoire. Un exemple de projet est en cours de construction. Toutes les fonctionnalités ne sont pas encore couvertes.
Le moyen le plus simple est d'utiliser GifImageView
(ou GifImageButton
) comme un ImageView
normal :
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
Si les drawables déclarés par android:src
et/ou android:background
sont des fichiers GIF alors ils seront automatiquement reconnus comme GifDrawable
et animés. Si le dessinable donné n'est pas un GIF, les vues mentionnées fonctionnent comme de simples ImageView
et ImageButton
.
GifTextView
vous permet d'utiliser des GIF comme éléments de dessin et arrière-plan composés.
<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
et GifTextView
ont également implémenté des hooks pour les setters. Ainsi, les GIF animés peuvent être définis en appelant setImageResource(int resId)
et setBackgroundResource(int resId)
GifDrawable
peut être construit directement à partir de diverses sources :
//asset fileGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //ressource (dessinable ou brute)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //peut être nul pour le fichier:// 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 ); //chemin du fichierGifDrawable 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 (il doit prendre en charge le marquage)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //direct ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
Les InputStreams sont fermés automatiquement dans le finaliseur si GifDrawable n'est plus nécessaire, vous n'avez donc pas besoin de les fermer explicitement. L’appel recycle()
fermera également la source d’entrée sous-jacente.
Notez que toutes les sources d'entrée doivent pouvoir revenir en arrière jusqu'au début. Il est nécessaire de lire correctement les GIF animés (où l'animation est reproductible) puisque les images suivantes sont décodées à la demande de la source.
GifDrawable
implémente Animatable
et MediaPlayerControl
afin que vous puissiez utiliser ses méthodes et plus :
stop()
- arrête l'animation, peut être appelé depuis n'importe quel thread
start()
- démarre l'animation, peut être appelé depuis n'importe quel thread
isRunning()
- renvoie si l'animation est en cours d'exécution ou non
reset()
- rembobine l'animation, ne redémarre pas celle arrêtée
setSpeed(float factor)
- définit un nouveau facteur de vitesse d'animation, par exemple. passer 2.0f doublera la vitesse d'animation
seekTo(int position)
- recherche l'animation (dans la boucle actuelle) jusqu'à position
donnée (en millisecondes)
getDuration()
- renvoie la durée d'une boucle de l'animation
getCurrentPosition()
- renvoie le temps écoulé depuis le début d'une boucle d'animation en cours
Les contrôles standard d'un MediaPlayer (comme dans VideoView) peuvent être utilisés pour contrôler l'animation GIF et afficher sa progression actuelle.
Définissez simplement GifDrawable
comme MediaPlayer sur votre MediaController comme ceci :
@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()
- renvoie un nombre de boucles tel que défini dans l'extension NETSCAPE 2.0
getNumberOfFrames()
- renvoie le nombre d'images (au moins 1)
getComment()
- renvoie le texte du commentaire ( null
si le GIF n'a pas de commentaire)
getFrameByteCount()
- renvoie le nombre minimum d'octets pouvant être utilisés pour stocker les pixels d'une seule image
getAllocationByteCount()
- renvoie la taille (en octets) de la mémoire allouée utilisée pour stocker les pixels d'un GifDrawable donné
getInputSourceByteCount()
- renvoie la longueur (en octets) des données d'entrée de sauvegarde
toString()
- renvoie des informations lisibles par l'homme sur la taille de l'image et le nombre d'images (destiné à des fins de débogage)
GifDrawable
à plusieurs View
s Normalement, une seule instance GifDrawable
associée à plusieurs View
s'animera uniquement sur la dernière. Pour résoudre cette instance de création MultiCallback
, ajoutez-y View
s et définissez le rappel pour un dessin donné, par exemple :
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
Notez que si vous modifiez un dessin de, par exemple ImageView
, le rappel sera supprimé du dessin précédent. Par la suite, vous devez réaffecter le rappel ou la même instance GifDrawable
cessera de s'animer. Voir #480 pour plus d'informations.
recycle()
- fourni pour accélérer la libération de mémoire (comme dans android.graphics.Bitmap
)
isRecycled()
- vérifie si le dessinable est recyclé
getError()
- renvoie les détails de la dernière erreur
Le niveau minimum de l'API est désormais de 17 (Android 4.2). armeabi
(arm v5 et v6) n'est plus pris en charge.
Le niveau minimum de l'API est désormais de 14 (Android 4.0).
N'a de sens que si les règles de protection des consommateurs (fournies avec la bibliothèque) ne sont pas utilisées (elles sont utilisées par défaut par Gradle).
La règle Proguard a été modifiée pour -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
1.1.17 est la dernière version prenant en charge le niveau API 8 (Froyo). À partir de la version 1.2.0, le niveau minimum de l'API est de 9 (pain d'épice).
La gestion de plusieurs cas extrêmes a été modifiée :
GifDrawable#getNumberOfFrames()
renvoie désormais 0 lorsque GifDrawable
est recyclé
Les informations incluses dans le résultat de GifDrawable#toString()
lorsque GifDrawable
est recyclé contiennent désormais uniquement des zéros.
Il est recommandé (mais pas obligatoire) d'appeler LibraryLoader.initialize()
avant d'utiliser GifDrawable
. Context
est nécessaire dans certains cas lorsque les bibliothèques natives ne peuvent pas être extraites normalement. Voir ReLinker pour plus de détails. Si LibraryLoader.initialize()
n'a pas été appelé et que le chargement normal de la bibliothèque échoue, Context
sera tenté d'être récupéré de manière de secours, ce qui ne fonctionnera pas toujours.
Le paramètre int
loopNumber
a été ajouté à AnimationListener#onAnimationCompleted()
.
La configuration de Proguard est désormais fournie avec la bibliothèque, vous n'avez pas besoin de la spécifier vous-même.
L'attribut XML src
dans GifTextureView
a été renommé gifSource
pour éviter d'éventuels conflits avec d'autres bibliothèques.
La configuration de Proguard a été modifiée comme suit :
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
utilise désormais android.graphics.Bitmap
comme frame buffer. Essayer d'accéder aux pixels (y compris le dessin) de GifDrawable
recyclé provoquera IllegalStateException
comme dans Bitmap
.
Le niveau minimum de l'API est désormais de 8 (Android 2.2).
Le rendu est effectué dans le thread d'arrière-plan exécuté indépendamment du thread principal, de sorte que l'animation s'exécute même si le dessin n'est pas dessiné. Cependant, le rendu ne s'exécute pas si drawable n'est pas visible, voir [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). Cette méthode peut être utilisée pour contrôler la visibilité dessinable dans les cas où elle n'est pas déjà gérée par le framework Android.
Cette bibliothèque utilise le code de GIFLib 5.1.3 et SKIA.
ImageFactory
Plugin NativeScript de Brad Martin disponible sur NPM
Sketch Chargeur d'images puissant et complet sur Android, avec prise en charge du GIF, du zoom gestuel et de l'affichage en bloc d'images très grandes.
Vous souhaitez inclure votre projet ici ? Remplir un problème
Licence MIT
Voir fichier LICENCE.