Android: Comment afficher un grand gif animé avec une URL?
Supposons que j'ai la URL pour les grandes gif animé, et je voulais faire un youtube like activité qui affiche l'animation en streaming. Comment puis-je
- flux dans l'image?
- obtenir affichent avec animation?
Je sais ImageView
n'est pas la réponse car il n'affiche que la première image.
Un bonus serait d'avoir accès à son état de mise en mémoire tampon afin que je puisse synchroniser les sons en flux continu ainsi-tout cela fait partie d'un YTMND d'application de l'observateur. Alors que je pouvais créer un service qui convertit le public des fichiers gif dans un beau format, j'aimerais que l'application fonctionne sans autres dépendances.
source d'informationauteur rndmcnlly
Vous devez vous connecter pour publier un commentaire.
Le général esquisse de la solution est d'utiliser employer personnalisé
View
qui attire demande unMovie
à dessiner lui-même à laCanvas
périodiquement.La première étape est la construction de la
Movie
instance. Il y a l'usine appeléedecodeStream
que peut faire un film donné unInputStream
mais il n'est pas assez pour utiliser le flux à partir d'unUrlConnection
. Si vous essayez cela, vous obtiendrez unIOException
quand le film chargeur essaie de l'appelerreset
sur le stream. Le hack, malheureux, car il est, est d'utiliser un séparéBufferedInputStream
à main-mismark
dire à économiser suffisamment de données quereset
de ne pas échouer. Heureusement, laURLConnection
peut nous dire combien de données à attendre. Je dis que ce hack, est malheureuse parce qu'elle exige effectivement l'ensemble de l'image à être mises en mémoire tampon (qui n'est pas un problème pour les applications de bureau, mais c'est un problème grave sur une contrainte de mémoire de l'appareil mobile).Voici une capture de la
Movie
de code de configuration:Ensuite, vous devez créer une vue qui affiche ce
Movie
. Une sous-classe deView
avec une coutumeonDraw
fera l'affaire (en supposant qu'il a accès à laMovie
que vous avez créé avec le code précédent).La vue ne sera pas déclencher lui-même à être redessiné, sans aide, et aveuglément appel
invalidate()
à la fin deonDraw
est juste un gaspillage d'énergie. Dans un autre thread (probablement celui que vous avez utilisé pour télécharger les données de l'image), vous pouvez poster des messages pour le thread principal, demander le point de vue d'être invalidé à un rythme régulier (mais pas fou) de l'apce.Vraiment une bonne solution aurait toutes sortes de doux barres de progression et de contrôle d'erreur, mais le cœur est ici.
Avez-vous essayé
BitmapDecode
?Il y a un exemple dans l'API Démos ici.
Glide s'avérer la plus facile et efficace pour réaliser cela avec juste une ligne de code :-
Résultat est là :-
Gif prises à partir d'ici http://giphy.com/search/big-gif/3
Add jar à partir d'ici :- https://github.com/bumptech/glide/releases
Peut-être AnimationDrawable pourrait travailler pour vous? EDIT: Pas si vous voulez charger à partir d'une URL comme ce poste est d'environ. Désolé
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
En fonction de la complexité du GIF c'est à dire si c'est un simple chargement/indicateur de progression vous risquez de casser l'GIF outre, enregistrer chaque image séparément et l'utilisation de l'Android du Cadre de AnimationDrawable.
Pour de simples barres de progression, ce sont peut-être moins enclins à faire des erreurs, peut-être encore plus performant.