View
mensajes de texto y Drawable
para GIF animados en Android.
El GIFLib incluido a través de JNI se utiliza para representar fotogramas. Esta forma debería ser más eficiente que las clases WebView
o Movie
.
Inserte la siguiente dependencia en el archivo build.gradle
de su proyecto.
dependencias { implementación 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Tenga en cuenta que el repositorio central de Maven debe definirse, por ejemplo. en build.gradle
de nivel superior así:
construir script { repositorios { expertoCentral() } } todos los proyectos { repositorios { expertoCentral() } }
Las compilaciones de desarrollo actuales (compilaciones de la rama dev
) se publican en el repositorio de instantáneas de OSS. Para usarlos, especifique la URL del repositorio en el bloque repositories
:
repositorios { expertoCentral() experto {url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencias { implementación 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<dependencia> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-dibujable</artifactId> <version>inserte la última versión aquí</version> <tipo>aar</tipo> </dependencia>
Consulte Proyecto de eclipse de muestra con instrucciones de configuración.
Descargas de la última versión
Android 4.2+ (nivel API 17+)
para renderizado acelerado por hardware GifTextureView
para GifTexImage2D
OpenGL ES 2.0+
Se necesita el NDK de Android para compilar fuentes nativas
Ver directorio sample
. El proyecto de muestra está en construcción. No todas las funciones están cubiertas todavía.
La forma más sencilla es utilizar GifImageView
(o GifImageButton
) como 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 los elementos de diseño declarados por android:src
y/o android:background
son archivos GIF, se reconocerán automáticamente como GifDrawable
y se animarán. Si el elemento de diseño dado no es un GIF, las vistas mencionadas funcionan como ImageView
e ImageButton
simples.
GifTextView
te permite usar GIF como elementos de diseño compuestos y fondo.
<pl.drowable/bg_anim "/>
GifImageView
, GifImageButton
y GifTextView
también tienen implementados ganchos para configuradores. Por lo tanto, los GIF animados se pueden configurar llamando setImageResource(int resId)
y setBackgroundResource(int resId)
GifDrawable
se puede construir directamente a partir de varias fuentes:
//activo fileGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif"); //recurso (dibujable o sin procesar)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //puede ser nulo para el archivo:// 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 ); //ruta del archivoGifDrawable gifFromPath = new GifDrawable( "/ruta/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 (debe admitir marcado)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //direct ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
Los InputStreams se cierran automáticamente en el finalizador si GifDrawable ya no es necesario, por lo que no es necesario cerrarlos explícitamente. Llamar recycle()
también cerrará la fuente de entrada subyacente.
Tenga en cuenta que todas las fuentes de entrada deben poder rebobinarse hasta el principio. Es necesario reproducir correctamente los GIF animados (donde la animación es repetible), ya que los fotogramas posteriores se decodifican según demanda desde la fuente.
GifDrawable
implementa Animatable
y MediaPlayerControl
para que puedas usar sus métodos y más:
stop()
- detiene la animación, se puede llamar desde cualquier hilo
start()
- inicia la animación, se puede llamar desde cualquier hilo
isRunning()
- devuelve si la animación se está ejecutando actualmente o no
reset()
- rebobina la animación, no reinicia la que se ha detenido
setSpeed(float factor)
: establece un nuevo factor de velocidad de animación, por ejemplo. pasar 2.0f duplicará la velocidad de la animación
seekTo(int position)
: busca la animación (dentro del bucle actual) en position
determinada (en milisegundos)
getDuration()
- devuelve la duración de un bucle de la animación
getCurrentPosition()
- devuelve el tiempo transcurrido desde el comienzo de un bucle actual de animación
Se pueden usar controles estándar para un MediaPlayer (como en VideoView) para controlar la animación GIF y mostrar su progreso actual.
Simplemente configure GifDrawable
como MediaPlayer en su MediaController de esta manera:
@Overrideprotected void onCreate(Bundle saveInstanceState) {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()
: devuelve un recuento de bucles tal como se define en la extensión NETSCAPE 2.0
getNumberOfFrames()
- devuelve el número de fotogramas (al menos 1)
getComment()
: devuelve el texto del comentario ( null
si el GIF no tiene comentarios)
getFrameByteCount()
: devuelve el número mínimo de bytes que se pueden usar para almacenar píxeles de un solo fotograma
getAllocationByteCount()
: devuelve el tamaño (en bytes) de la memoria asignada utilizada para almacenar píxeles de GifDrawable determinado
getInputSourceByteCount()
: devuelve la longitud (en bytes) de los datos de entrada de respaldo
toString()
: devuelve información legible por humanos sobre el tamaño de la imagen y el número de fotogramas (destinado a fines de depuración)
GifDrawable
con múltiples View
s Normalmente, una sola instancia GifDrawable
asociada con múltiples View
se animará solo en la última. Para resolver la creación de una instancia MultiCallback
, agréguele View
y configure la devolución de llamada para el elemento de diseño determinado, por ejemplo:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
Tenga en cuenta que si cambia un elemento de diseño, por ejemplo, ImageView
, la devolución de llamada se eliminará del elemento de diseño anterior. A partir de entonces, deberá reasignar la devolución de llamada o la misma instancia GifDrawable
dejará de animarse. Consulte el n.° 480 para obtener más información.
recycle()
: proporcionado para acelerar la liberación de memoria (como en android.graphics.Bitmap
)
isRecycled()
- comprueba si el elemento dibujable se recicla
getError()
- devuelve los detalles del último error
El nivel mínimo de API ahora es 17 (Android 4.2). armeabi
(arm v5 y v6) ya no es compatible.
El nivel mínimo de API ahora es 14 (Android 4.0).
Significativo solo si no se utilizan las reglas de protección del consumidor (incluidas con la biblioteca) (Gradle las usa de forma predeterminada).
La regla de Proguard ha cambiado a -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
1.1.17 es la última versión que admite el nivel API 8 (Froyo). A partir de 1.2.0, el nivel mínimo de API es 9 (Gingerbread).
Se ha cambiado el manejo de varios casos extremos:
GifDrawable#getNumberOfFrames()
ahora devuelve 0 cuando se recicla GifDrawable
La información incluida en el resultado de GifDrawable#toString()
cuando se recicla GifDrawable
ahora contiene solo ceros
Se recomienda (pero no es obligatorio) llamar LibraryLoader.initialize()
antes de usar GifDrawable
. Se necesita Context
en algunos casos cuando las bibliotecas nativas no se pueden extraer normalmente. Consulte ReLinker para obtener más detalles. Si no se llamó LibraryLoader.initialize()
y falla la carga normal de la biblioteca, se intentará recuperar Context
de forma alternativa, lo que puede no siempre funcionar.
El parámetro int
loopNumber
se ha agregado a AnimationListener#onAnimationCompleted()
.
La configuración de Proguard ahora está incluida con la biblioteca, no es necesario que la especifique usted mismo.
Se ha cambiado el nombre del atributo XML src
en GifTextureView
a gifSource
para evitar posibles conflictos con otras bibliotecas.
La configuración de Proguard ha cambiado a:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
ahora usa android.graphics.Bitmap
como búfer de fotogramas. Intentar acceder a píxeles (incluido el dibujo) de GifDrawable
reciclado provocará IllegalStateException
como en Bitmap
.
El nivel mínimo de API ahora es 8 (Android 2.2).
El renderizado se realiza en un subproceso en segundo plano que se ejecuta independientemente del subproceso principal, por lo que la animación se ejecuta incluso si el elemento de diseño no está dibujado. Sin embargo, el procesamiento no se ejecuta si el elemento de diseño no está visible; consulte [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). Ese método se puede utilizar para controlar la visibilidad del diseño en los casos en que aún no lo maneja el marco de Android.
Esta biblioteca utiliza código de GIFLib 5.1.3 y SKIA.
fábrica de imágenes
Complemento NativeScript de Brad Martin disponible en NPM
Sketch Potente y completo cargador de imágenes en Android, con soporte para GIF, zoom por gestos y visualización de bloques de imágenes súper grandes.
¿Quieres incluir tu proyecto aquí? llenar un problema
Licencia MIT
Ver archivo de LICENCIA.