2012-07-11 14 views
7

Estoy haciendo una aplicación de Android, en la que quiero reproducir un archivo GIF en una vista de imagen. He intentado de muchas maneras, he hecho una clase personalizada pero no he tenido éxito.Reproducción de un archivo de imagen GIF animado en imageview

¿Alguien ha implementado esto antes?

+0

posible duplicado de [Android - Pantalla gif animado] (http://stackoverflow.com/questions/3660209/android-display-animated-gif) –

+0

refieren este http://stackoverflow.com/questions/ 9158310/is-it-possible-to-set-an-animated-gif-file-as-live-wallpaper-in-android – Aerrow

Respuesta

7

Puede encontrar el código de muestra en las muestras de Android SDK. la imagen GIF se muestra en la actividad que se extiende View

El código para utilizar una imagen gif que no sea ImageView es

import android.app.Activity; 
import android.content.Context; 
import android.graphics.*; 
import android.graphics.drawable.*; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.*; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.ByteArrayOutputStream; 

public class BitmapDecode extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new SampleView(this)); 
    } 

    private static class SampleView extends View { 
     private Bitmap mBitmap; 
     private Bitmap mBitmap2; 
     private Bitmap mBitmap3; 
     private Bitmap mBitmap4; 
     private Drawable mDrawable; 

     private Movie mMovie; 
     private long mMovieStart; 

     private static byte[] streamToBytes(InputStream is) { 
      ByteArrayOutputStream os = new ByteArrayOutputStream(1024); 
      byte[] buffer = new byte[1024]; 
      int len; 
      try { 
       while ((len = is.read(buffer)) >= 0) { 
        os.write(buffer, 0, len); 
       } 
      } catch (java.io.IOException e) { 
      } 
      return os.toByteArray(); 
     } 

     public SampleView(Context context) { 
      super(context); 
      setFocusable(true); 

      java.io.InputStream is; 
      is = context.getResources().openRawResource(R.drawable.beach); 

      BitmapFactory.Options opts = new BitmapFactory.Options(); 
      Bitmap bm; 

      opts.inJustDecodeBounds = true; 
      bm = BitmapFactory.decodeStream(is, null, opts); 

      // now opts.outWidth and opts.outHeight are the dimension of the 
      // bitmap, even though bm is null 

      opts.inJustDecodeBounds = false; // this will request the bm 
      opts.inSampleSize = 4;    // scaled down by 4 
      bm = BitmapFactory.decodeStream(is, null, opts); 

      mBitmap = bm; 

      // decode an image with transparency 
      is = context.getResources().openRawResource(R.drawable.frog); 
      mBitmap2 = BitmapFactory.decodeStream(is); 

      // create a deep copy of it using getPixels() into different configs 
      int w = mBitmap2.getWidth(); 
      int h = mBitmap2.getHeight(); 
      int[] pixels = new int[w*h]; 
      mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h); 
      mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, 
              Bitmap.Config.ARGB_8888); 
      mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, 
              Bitmap.Config.ARGB_4444); 

      mDrawable = context.getResources().getDrawable(R.drawable.button); 
      mDrawable.setBounds(150, 20, 300, 100); 

      is = context.getResources().openRawResource(R.drawable.animated_gif); 
      if (true) { 
       mMovie = Movie.decodeStream(is); 
      } else { 
       byte[] array = streamToBytes(is); 
       mMovie = Movie.decodeByteArray(array, 0, array.length); 
      } 
     } 

     @Override protected void onDraw(Canvas canvas) { 
      canvas.drawColor(0xFFCCCCCC);    

      Paint p = new Paint(); 
      p.setAntiAlias(true); 

      canvas.drawBitmap(mBitmap, 10, 10, null); 
      canvas.drawBitmap(mBitmap2, 10, 170, null); 
      canvas.drawBitmap(mBitmap3, 110, 170, null); 
      canvas.drawBitmap(mBitmap4, 210, 170, null); 

      mDrawable.draw(canvas); 

      long now = android.os.SystemClock.uptimeMillis(); 
      if (mMovieStart == 0) { // first time 
       mMovieStart = now; 
      } 
      if (mMovie != null) { 
       int dur = mMovie.duration(); 
       if (dur == 0) { 
        dur = 1000; 
       } 
       int relTime = (int)((now - mMovieStart) % dur); 
       mMovie.setTime(relTime); 
       mMovie.draw(canvas, getWidth() - mMovie.width(), 
          getHeight() - mMovie.height()); 
       invalidate(); 
      } 
     } 
    } 
} 

Puede utilizar estos enlaces, así

http://weavora.com/blog/2012/02/07/android-how-to-use-animated-gif/

http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android-part-1/

+1

whoaa ... para mostrar un simple gif, ¿tiene que escribir tanto código? el sistema necesita ser cambiado –

3

Natively ImageView no admite imágenes animadas. Se pueden utilizar dos opciones para mostrar el archivo GIF animado

  1. Uso VideoView
  2. Uso ImageView

Pero dividir el archivo GIF en varias partes y luego aplicar la animación a la misma. Prueba este link-playing-gif-animation para obtener el resultado deseado.

+1

¿Puedes decir cómo se puede hacer usando VideoView? –

+0

@SHAKIRSHABBIR http://stackoverflow.com/a/26712205/945247 – Leon

5

Puede visualizar Gif en Android sin usar ninguna biblioteca de terceros. Así es como lo hice.

Haga una vista web.

<WebView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageWebView" /> 

mayoría de los ejemplos muestra cómo abrir un archivo de carpeta de recursos, pero aquí os muestro cómo abrirlo desde una tarjeta SD/memoria.

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);