Agregué una imagen gif animada en una imageView. No puedo verlo como una imagen gif. No hay animación ahí. Aparece solo como una imagen fija. Me gustaría saber cómo puedo mostrarlo como una imagen gif.
si exactamente desea agregar una imagen gif solo en la vista de imagen, no en la vista web que usar esto, funciona bien para mí stackoverflow.com/a/29488519/3514144
Primero, copie su imagen GIF en la carpeta de activos de su aplicación, cree las siguientes clases y pegue el código
AnimationActivity: -
publicclassAnimationActivityextendsActivity{/** Called when the activity is first created. */@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);InputStream stream =null;try{
stream = getAssets().open("piggy.gif");}catch(IOException e){
e.printStackTrace();}GifWebView view =newGifWebView(this,"file:///android_asset /piggy.gif");
setContentView(view);}}
GifDecoder: -
publicclassGifDecoder{publicstaticfinalint STATUS_OK =0;publicstaticfinalint STATUS_FORMAT_ERROR =1;publicstaticfinalint STATUS_OPEN_ERROR =2;protectedstaticfinalint MAX_STACK_SIZE =4096;protectedInputStreamin;protectedint status;protectedint width;// full image widthprotectedint height;// full image heightprotectedboolean gctFlag;// global color table usedprotectedint gctSize;// size of global color tableprotectedint loopCount =1;// iterations; 0 = repeat foreverprotectedint[] gct;// global color tableprotectedint[] lct;// local color tableprotectedint[] act;// active color tableprotectedint bgIndex;// background color indexprotectedint bgColor;// background colorprotectedint lastBgColor;// previous bg colorprotectedint pixelAspect;// pixel aspect ratioprotectedboolean lctFlag;// local color table flagprotectedboolean interlace;// interlace flagprotectedint lctSize;// local color table sizeprotectedint ix, iy, iw, ih;// current image rectangleprotectedint lrx, lry, lrw, lrh;protectedBitmap image;// current frameprotectedBitmap lastBitmap;// previous frameprotectedbyte[] block =newbyte[256];// current data blockprotectedint blockSize =0;// block size last graphic control extension infoprotectedint dispose =0;// 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prevprotectedint lastDispose =0;protectedboolean transparency =false;// use transparent colorprotectedint delay =0;// delay in millisecondsprotectedint transIndex;// transparent color index// LZW decoder working arraysprotectedshort[] prefix;protectedbyte[] suffix;protectedbyte[] pixelStack;protectedbyte[] pixels;protectedVector<GifFrame> frames;// frames read from current fileprotectedint frameCount;privatestaticclassGifFrame{publicGifFrame(Bitmap im,intdel){
image = im;
delay =del;}publicBitmap image;publicint delay;}publicint getDelay(int n){
delay =-1;if((n >=0)&&(n < frameCount)){
delay = frames.elementAt(n).delay;}return delay;}publicint getFrameCount(){return frameCount;}publicBitmap getBitmap(){return getFrame(0);}publicint getLoopCount(){return loopCount;}protectedvoid setPixels(){int[] dest =newint[width * height];if(lastDispose >0){if(lastDispose ==3){// use image before lastint n = frameCount -2;if(n >0){
lastBitmap = getFrame(n -1);}else{
lastBitmap =null;}}if(lastBitmap !=null){
lastBitmap.getPixels(dest,0, width,0,0, width, height);if(lastDispose ==2){// fill last image rect area with background colorint c =0;if(!transparency){
c = lastBgColor;}for(int i =0; i < lrh; i++){int n1 =(lry + i)* width + lrx;int n2 = n1 + lrw;for(int k = n1; k < n2; k++){
dest[k]= c;}}}}}intpass=1;int inc =8;int iline =0;for(int i =0; i < ih; i++){int line = i;if(interlace){if(iline >= ih){pass++;switch(pass){case2:
iline =4;break;case3:
iline =2;
inc =4;break;case4:
iline =1;
inc =2;break;default:break;}}
line = iline;
iline += inc;}
line += iy;if(line < height){int k = line * width;int dx = k + ix;// start of line in destint dlim = dx + iw;// end of dest lineif((k + width)< dlim){
dlim = k + width;// past dest edge}int sx = i * iw;// start of line in sourcewhile(dx < dlim){// map color and insert in destinationint index =((int) pixels[sx++])&0xff;int c = act[index];if(c !=0){
dest[dx]= c;}
dx++;}}}
image =Bitmap.createBitmap(dest, width, height,Config.ARGB_4444);}publicBitmap getFrame(int n){if(frameCount <=0)returnnull;
n = n % frameCount;return((GifFrame) frames.elementAt(n)).image;}publicint read(InputStreamis){
init();if(is!=null){in=is;
readHeader();if(!err()){
readContents();if(frameCount <0){
status = STATUS_FORMAT_ERROR;}}}else{
status = STATUS_OPEN_ERROR;}try{is.close();}catch(Exception e){}return status;}protectedvoid decodeBitmapData(){int nullCode =-1;int npix = iw * ih;int available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, count, i, datum, data_size, first, top, bi, pi;if((pixels ==null)||(pixels.length < npix)){
pixels =newbyte[npix];// allocate new pixel array}if(prefix ==null){
prefix =newshort[MAX_STACK_SIZE];}if(suffix ==null){
suffix =newbyte[MAX_STACK_SIZE];}if(pixelStack ==null){
pixelStack =newbyte[MAX_STACK_SIZE +1];}
data_size = read();
clear =1<< data_size;
end_of_information = clear +1;
available = clear +2;
old_code = nullCode;
code_size = data_size +1;
code_mask =(1<< code_size)-1;for(code =0; code < clear; code++){
prefix[code]=0;// XXX ArrayIndexOutOfBoundsException
suffix[code]=(byte) code;}
datum = bits = count = first = top = pi = bi =0;for(i =0; i < npix;){if(top ==0){if(bits < code_size){// Load bytes until there are enough bits for a code.if(count ==0){// Read a new data block.
count = readBlock();if(count <=0){break;}
bi =0;}
datum +=(((int) block[bi])&0xff)<< bits;
bits +=8;
bi++;
count--;continue;}
code = datum & code_mask;
datum >>= code_size;
bits -= code_size;if((code > available)||(code == end_of_information)){break;}if(code == clear){// Reset decoder.
code_size = data_size +1;
code_mask =(1<< code_size)-1;
available = clear +2;
old_code = nullCode;continue;}if(old_code == nullCode){
pixelStack[top++]= suffix[code];
old_code = code;
first = code;continue;}
in_code = code;if(code == available){
pixelStack[top++]=(byte) first;
code = old_code;}while(code > clear){
pixelStack[top++]= suffix[code];
code = prefix[code];}
first =((int) suffix[code])&0xff;if(available >= MAX_STACK_SIZE){break;}
pixelStack[top++]=(byte) first;
prefix[available]=(short) old_code;
suffix[available]=(byte) first;
available++;if(((available & code_mask)==0)&&(available < MAX_STACK_SIZE)){
code_size++;
code_mask += available;}
old_code = in_code;}// Pop a pixel off the pixel stack.
top--;
pixels[pi++]= pixelStack[top];
i++;}for(i = pi; i < npix; i++){
pixels[i]=0;// clear missing pixels}}protectedboolean err(){return status != STATUS_OK;}protectedvoid init(){
status = STATUS_OK;
frameCount =0;
frames =newVector<GifFrame>();
gct =null;
lct =null;}protectedint read(){int curByte =0;try{
curByte =in.read();}catch(Exception e){
status = STATUS_FORMAT_ERROR;}return curByte;}protectedint readBlock(){
blockSize = read();int n =0;if(blockSize >0){try{int count =0;while(n < blockSize){
count =in.read(block, n, blockSize - n);if(count ==-1){break;}
n += count;}}catch(Exception e){
e.printStackTrace();}if(n < blockSize){
status = STATUS_FORMAT_ERROR;}}return n;}protectedint[] readColorTable(int ncolors){int nbytes =3* ncolors;int[] tab =null;byte[] c =newbyte[nbytes];int n =0;try{
n =in.read(c);}catch(Exception e){
e.printStackTrace();}if(n < nbytes){
status = STATUS_FORMAT_ERROR;}else{
tab =newint[256];// max size to avoid bounds checksint i =0;int j =0;while(i < ncolors){int r =((int) c[j++])&0xff;int g =((int) c[j++])&0xff;int b =((int) c[j++])&0xff;
tab[i++]=0xff000000|(r <<16)|(g <<8)| b;}}return tab;}protectedvoid readContents(){// read GIF file content blocksbooleandone=false;while(!(done|| err())){int code = read();switch(code){case0x2C:// image separator
readBitmap();break;case0x21:// extension
code = read();switch(code){case0xf9:// graphics control extension
readGraphicControlExt();break;case0xff:// application extension
readBlock();String app ="";for(int i =0; i <11; i++){
app +=(char) block[i];}if(app.equals("NETSCAPE2.0")){
readNetscapeExt();}else{
skip();// don't care}break;case0xfe:// comment extension
skip();break;case0x01:// plain text extension
skip();break;default:// uninteresting extension
skip();}break;case0x3b:// terminatordone=true;break;case0x00:// bad byte, but keep going and see what happens break;default:
status = STATUS_FORMAT_ERROR;}}}protectedvoid readGraphicControlExt(){
read();// block sizeint packed = read();// packed fields
dispose =(packed &0x1c)>>2;// disposal methodif(dispose ==0){
dispose =1;// elect to keep old image if discretionary}
transparency =(packed &1)!=0;
delay = readShort()*10;// delay in milliseconds
transIndex = read();// transparent color index
read();// block terminator}protectedvoid readHeader(){String id ="";for(int i =0; i <6; i++){
id +=(char) read();}if(!id.startsWith("GIF")){
status = STATUS_FORMAT_ERROR;return;}
readLSD();if(gctFlag &&!err()){
gct = readColorTable(gctSize);
bgColor = gct[bgIndex];}}protectedvoid readBitmap(){
ix = readShort();// (sub)image position & size
iy = readShort();
iw = readShort();
ih = readShort();int packed = read();
lctFlag =(packed &0x80)!=0;// 1 - local color table flag interlace
lctSize =(int)Math.pow(2,(packed &0x07)+1);
interlace =(packed &0x40)!=0;if(lctFlag){
lct = readColorTable(lctSize);// read table
act = lct;// make local table active}else{
act = gct;// make global table activeif(bgIndex == transIndex){
bgColor =0;}}int save =0;if(transparency){
save = act[transIndex];
act[transIndex]=0;// set transparent color if specified}if(act ==null){
status = STATUS_FORMAT_ERROR;// no color table defined}if(err()){return;}
decodeBitmapData();// decode pixel data
skip();if(err()){return;}
frameCount++;// create new image to receive frame data
image =Bitmap.createBitmap(width, height,Config.ARGB_4444);
setPixels();// transfer pixel data to image
frames.addElement(newGifFrame(image, delay));// add image to frame// listif(transparency){
act[transIndex]= save;}
resetFrame();}protectedvoid readLSD(){// logical screen size
width = readShort();
height = readShort();// packed fieldsint packed = read();
gctFlag =(packed &0x80)!=0;// 1 : global color table flag// 2-4 : color resolution// 5 : gct sort flag
gctSize =2<<(packed &7);// 6-8 : gct size
bgIndex = read();// background color index
pixelAspect = read();// pixel aspect ratio}protectedvoid readNetscapeExt(){do{
readBlock();if(block[0]==1){// loop count sub-blockint b1 =((int) block[1])&0xff;int b2 =((int) block[2])&0xff;
loopCount =(b2 <<8)| b1;}}while((blockSize >0)&&!err());}protectedint readShort(){// read 16-bit value, LSB firstreturn read()|(read()<<8);}protectedvoid resetFrame(){
lastDispose = dispose;
lrx = ix;
lry = iy;
lrw = iw;
lrh = ih;
lastBitmap = image;
lastBgColor = bgColor;
dispose =0;
transparency =false;
delay =0;
lct =null;}protectedvoid skip(){do{
readBlock();}while((blockSize >0)&&!err());}}
¡básicamente no necesita todo eso ya que crea decodificadores y código comlex y nunca lo usa! está utilizando GifWebView view = new GifWebView (this, "file: /// android_asset /piggy.gif"); que llama a una subclase de webview que no tiene personalización para webview, puede reemplazar todo este código con 3 líneas ... webView wView = new webView (this); wView.loadUrl ("archivo: ///android_asset/piggy.gif"); setContentView (ver);
Ahmad Dwaik 'Brujo'
2
Hola gracias por tu respuesta .. :) está funcionando bien !! pero tengo un problema con webview (en la clase GifWebView) es mostrar el archivo gif más grande que la pantalla del dispositivo. Entonces, ¿cómo proporcionar ancho y alto personalizados para esa vista O bien, ¿puedo usar cualquier otra vista?
Aprendiz de Android
¿Esto solo reproducirá mi gif una vez? No va a seguir recorriendo el gif ??? ¿Hay alguna forma de volver a ejecutar los métodos para mostrarlo nuevamente?
ACTUALIZACIÓN : a partir de Android Gradle Plugin 3.0.0 , el nuevo comando para compilar es implementation, por lo que la línea anterior podría tener que cambiarse a:
Esta respuesta es la mejor respuesta y funciona muy bien para mí, intenté algo diferente y construí clases e increíble después de que encontré esto ... Gracias señor;)
Alexiscanny
suave, mejor que planear para gif
Himanshu Shekher Jha
1
También lo mejor para mí, implementado en 10 segundos
Diogo García
simple paso Esta debería ser la respuesta. hecho en minutos
sunil
3
¿No pl.droidsonroids.gif.GifImageViewdebería usarse en su lugar?
Flimm
23
Use VideoView.
Nativamente ImageView no admite imágenes animadas. Tienes dos opciones para mostrar un archivo gif animado
Utilizar VideoView
Use ImageViewy divida el archivo gif en varias partes y luego aplíquele animación
ImageView imageView = findViewById(R.id.imageView);/* from internet*/Glide.with(this).load("https://media.giphy.com/media/98uBZTzlXMhkk/giphy.gif").into(imageView);/*from raw folder*/Glide.with(this).load(R.raw.giphy).into(imageView);
Use una vista web en su archivo xml, y ajuste su posición al lugar donde exactamente estaba tratando de mostrarle la imagen .gif.
En su actividad, inicie esta pequeña parte de la vista web como otras vistas.
coloque la imagen .gif en la carpeta de activos
ahora cargue la imagen como si estuviera cargando una url en la vista web como "diyaWebView1.loadUrl (" file: ///android_asset/www/diya.gif ");"
puedes ver tu imagen .gif cuando inicias la aplicación.
PD: esto funciona si la imagen .gif se ajusta a su vista web o viceversa, si la imagen es más grande que la vista web, la barra de desplazamiento se habilita y el usuario puede desplazar la imagen vista web AKA. Por lo tanto, debemos tener cuidado cuando usamos esto, para dar el tamaño adecuado a la vista web según la imagen o editar la imagen que se ajuste a su vista web.
Necesitamos usar gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);como cuando el hardware está acelerado, la imagen GIF no funciona en esos dispositivos. El hardware acelerado está habilitado en los dispositivos anteriores (4.x).
¡Simplemente introduzca este código en el método onCreate y listo! Además, coloque su gif dentro de la assetscarpeta (si no tiene la carpeta de activos, cree una debajo src/main)
Puede mostrar cualquier imagen gif a través de la biblioteca Fresco de Facebook :
Uri uri =Uri.parse("http://domain.com/awersome.gif");finalSimpleDraweeView draweeView =newSimpleDraweeView(context);finalLinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(200,200);
draweeView.setLayoutParams(params);DraweeController controller =Fresco.newDraweeControllerBuilder().setUri(uri).setAutoPlayAnimations(true).build();
draweeView.setController(controller);//now just add draweeView to layout and enjoy
Los GIF también se pueden mostrar en la vista web con un par de líneas de código y sin bibliotecas de terceros. De esta manera, incluso puede cargar el gif desde su tarjeta SD. No es necesario copiar imágenes a su carpeta de activos.
El uso puede abrir un archivo gif desde la tarjeta SD no solo desde la carpeta de activos como se muestra en muchos ejemplos.
WebView webView =(WebView) findViewById(R.id.imageWebView);String data ="<body> <img src = \""+ filePath+"\"/></body>";// 'filePath' is the path of your .GIF file on SD card.
webView.loadDataWithBaseURL("file:///android_asset/",data,"text/html","UTF-8",null);
Respuestas:
Primero, copie su imagen GIF en la carpeta de activos de su aplicación, cree las siguientes clases y pegue el código AnimationActivity: -
GifDecoder: -
GifDecoderView: -
GifMovieView: -
GifWebView: -
Creo que podría ayudarte ... :)
fuente
En su build.gradle (Módulo: aplicación), agregue
android-gif-drawable
como dependencia agregando el siguiente código:ACTUALIZACIÓN : a partir de Android Gradle Plugin 3.0.0 , el nuevo comando para compilar es
implementation
, por lo que la línea anterior podría tener que cambiarse a:Luego sincroniza tu proyecto. Cuando finalice la sincronización, vaya a su archivo de diseño y agregue el siguiente código:
Y eso es todo, puede administrarlo con un simple ImageView.
fuente
pl.droidsonroids.gif.GifImageView
debería usarse en su lugar?Use VideoView.
Nativamente ImageView no admite imágenes animadas. Tienes dos opciones para mostrar un archivo gif animado
VideoView
ImageView
y divida el archivo gif en varias partes y luego aplíquele animaciónfuente
VideoView
se puede usar para mostrar el GIF animado.con la última biblioteca Glide
usar Gradle:
en actividad o fragmento:
fuente
Mostrando GIF en Android
Crear
CustomGifView.java which extends View Class
Ahora llame a esta clase en su XML
notario público
Modifique AndroidManifest.xml para APAGAR el hardware Acelerado.
Referencia
Otro trucos
Para la funcionalidad de animación, puede visitar
fuente
Te sugiero que uses la biblioteca Glide. Para usar Glide necesita agregar esto para agregar estas dependencias
a su archivo grandle (Módulo: aplicación).
Luego use esta línea de código para cargar su imagen gif
Más información sobre Glide
fuente
Basado en el comentario de Ahmad Dwaik 'Warlock , probé el siguiente código y funcionó.
PD: esto funciona si la imagen .gif se ajusta a su vista web o viceversa, si la imagen es más grande que la vista web, la barra de desplazamiento se habilita y el usuario puede desplazar la imagen vista web AKA. Por lo tanto, debemos tener cuidado cuando usamos esto, para dar el tamaño adecuado a la vista web según la imagen o editar la imagen que se ajuste a su vista web.
fuente
Use Webview para cargar gif como
fuente
image.gif
GIFImageView
En XML
En archivo Java
Necesitamos usar
gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
como cuando el hardware está acelerado, la imagen GIF no funciona en esos dispositivos. El hardware acelerado está habilitado en los dispositivos anteriores (4.x).fuente
Como @Ahmad dijo en un comentario , ¡puedes usar el siguiente código para mostrar un gif!
¡Simplemente introduzca este código en el método onCreate y listo! Además, coloque su gif dentro de la
assets
carpeta (si no tiene la carpeta de activos, cree una debajosrc/main
)fuente
Podemos agregar fácilmente imágenes GIF animadas en imageview usando la biblioteca Ion.
Video tutorial :: https://www.youtube.com/watch?v=IqKtpdeIpjA
fuente
Esto es lo que funcionó para mí:
En su build.gradle (proyecto) escriba mavenCentral () en el buildscript {} y todos los proyectos {}. Debe tener un aspecto como este:
Luego, en build.gradle (módulo) agregue las dependencias {} este fragmento:
compile 'pl.droidsonroids.gif: android-gif-drawable: 1.2.4'
Debe tener un aspecto como este:
Pon tu imagen .gif en tu carpeta dibujable. Ahora ve a app> res> layout> activity_main.xml y agrega esto recortado para tu .gif:
Y tu estas listo :)
Enlaces útiles: https://github.com/koral--/android-gif-drawable
https://www.youtube.com/watch?v=EOFY0cwNjuk
Espero que esto ayude.
fuente
Puede mostrar cualquier imagen gif a través de la biblioteca Fresco de Facebook :
fuente
En primer lugar, agregue una dependencia en el
module:app
archivo build.gradleLuego, en el archivo de diseño
fuente
Los GIF también se pueden mostrar en la vista web con un par de líneas de código y sin bibliotecas de terceros. De esta manera, incluso puede cargar el gif desde su tarjeta SD. No es necesario copiar imágenes a su carpeta de activos.
Toma una vista web.
El uso puede abrir un archivo gif desde la tarjeta SD no solo desde la carpeta de activos como se muestra en muchos ejemplos.
fuente
Me enfrenté a un problema para usar
Y tampoco pude encontrar el archivo jar para agregar a mi proyecto. Entonces, para mostrar gif, uso WebView de esta manera:
fuente
Mostrar archivo GIF en Android
Agregue la siguiente dependencia en su archivo build.gradle.
En el diseño -
activity_xxxxx.xml
archivo agregue elGifImageview
siguiente.En su archivo Java, puede acceder al gif como se muestra a continuación.
fuente
fuente