GIF-Bild in einem ImageView in Android hinzufügen

Ich habe ein animiertes GIF-Bild in einem imageView hinzugefügt. Ich kann es nicht als GIF-Bild ansehen. Keine Animation ist da. Es erscheint nur als Standbild. Ich würde gerne wissen, wie ich es als ein gif-Bild zeigen kann.

Kopieren Sie zuerst Ihr GIF-Bild in den Asset-Ordner Ihrer App. Create create following classes und fügen Sie den Code AnimationActivity ein: –

public class AnimationActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); InputStream stream = null; try { stream = getAssets().open("piggy.gif"); } catch (IOException e) { e.printStackTrace(); } GifWebView view = new GifWebView(this, "file:///android_asset /piggy.gif"); setContentView(view); } } 

GifDecoder: –

 public class GifDecoder { public static final int STATUS_OK = 0; public static final int STATUS_FORMAT_ERROR = 1; public static final int STATUS_OPEN_ERROR = 2; protected static final int MAX_STACK_SIZE = 4096; protected InputStream in; protected int status; protected int width; // full image width protected int height; // full image height protected boolean gctFlag; // global color table used protected int gctSize; // size of global color table protected int loopCount = 1; // iterations; 0 = repeat forever protected int[] gct; // global color table protected int[] lct; // local color table protected int[] act; // active color table protected int bgIndex; // background color index protected int bgColor; // background color protected int lastBgColor; // previous bg color protected int pixelAspect; // pixel aspect ratio protected boolean lctFlag; // local color table flag protected boolean interlace; // interlace flag protected int lctSize; // local color table size protected int ix, iy, iw, ih; // current image rectangle protected int lrx, lry, lrw, lrh; protected Bitmap image; // current frame protected Bitmap lastBitmap; // previous frame protected byte[] block = new byte[256]; // current data block protected int blockSize = 0; // block size last graphic control extension info protected int dispose = 0; // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev protected int lastDispose = 0; protected boolean transparency = false; // use transparent color protected int delay = 0; // delay in milliseconds protected int transIndex; // transparent color index // LZW decoder working arrays protected short[] prefix; protected byte[] suffix; protected byte[] pixelStack; protected byte[] pixels; protected Vector frames; // frames read from current file protected int frameCount; private static class GifFrame { public GifFrame(Bitmap im, int del) { image = im; delay = del; } public Bitmap image; public int delay; } public int getDelay(int n) { delay = -1; if ((n >= 0) && (n < frameCount)) { delay = frames.elementAt(n).delay; } return delay; } public int getFrameCount() { return frameCount; } public Bitmap getBitmap() { return getFrame(0); } public int getLoopCount() { return loopCount; } protected void setPixels() { int[] dest = new int[width * height]; if (lastDispose > 0) { if (lastDispose == 3) { // use image before last int 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 color int 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; } } } } } int pass = 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) { case 2: iline = 4; break; case 3: iline = 2; inc = 4; break; case 4: 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 dest int dlim = dx + iw; // end of dest line if ((k + width) < dlim) { dlim = k + width; // past dest edge } int sx = i * iw; // start of line in source while (dx < dlim) { // map color and insert in destination int 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); } public Bitmap getFrame(int n) { if (frameCount <= 0) return null; n = n % frameCount; return ((GifFrame) frames.elementAt(n)).image; } public int read(InputStream is) { 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; } protected void 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 = new byte[npix]; // allocate new pixel array } if (prefix == null) { prefix = new short[MAX_STACK_SIZE]; } if (suffix == null) { suffix = new byte[MAX_STACK_SIZE]; } if (pixelStack == null) { pixelStack = new byte[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 } } protected boolean err() { return status != STATUS_OK; } protected void init() { status = STATUS_OK; frameCount = 0; frames = new Vector(); gct = null; lct = null; } protected int read() { int curByte = 0; try { curByte = in.read(); } catch (Exception e) { status = STATUS_FORMAT_ERROR; } return curByte; } protected int 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; } protected int[] readColorTable(int ncolors) { int nbytes = 3 * ncolors; int[] tab = null; byte[] c = new byte[nbytes]; int n = 0; try { n = in.read(c); } catch (Exception e) { e.printStackTrace(); } if (n < nbytes) { status = STATUS_FORMAT_ERROR; } else { tab = new int[256]; // max size to avoid bounds checks int 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; } protected void readContents() { // read GIF file content blocks boolean done = false; while (!(done || err())) { int code = read(); switch (code) { case 0x2C: // image separator readBitmap(); break; case 0x21: // extension code = read(); switch (code) { case 0xf9: // graphics control extension readGraphicControlExt(); break; case 0xff: // 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; case 0xfe:// comment extension skip(); break; case 0x01:// plain text extension skip(); break; default: // uninteresting extension skip(); } break; case 0x3b: // terminator done = true; break; case 0x00: // bad byte, but keep going and see what happens break; default: status = STATUS_FORMAT_ERROR; } } } protected void readGraphicControlExt() { read(); // block size int packed = read(); // packed fields dispose = (packed & 0x1c) >> 2; // disposal method if (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 } protected void 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]; } } protected void 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 active if (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(new GifFrame(image, delay)); // add image to frame // list if (transparency) { act[transIndex] = save; } resetFrame(); } protected void readLSD() { // logical screen size width = readShort(); height = readShort(); // packed fields int 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 } protected void readNetscapeExt() { do { readBlock(); if (block[0] == 1) { // loop count sub-block int b1 = ((int) block[1]) & 0xff; int b2 = ((int) block[2]) & 0xff; loopCount = (b2 << 8) | b1; } } while ((blockSize > 0) && !err()); } protected int readShort() { // read 16-bit value, LSB first return read() | (read() < < 8); } protected void resetFrame() { lastDispose = dispose; lrx = ix; lry = iy; lrw = iw; lrh = ih; lastBitmap = image; lastBgColor = bgColor; dispose = 0; transparency = false; delay = 0; lct = null; } protected void skip() { do { readBlock(); } while ((blockSize > 0) && !err()); } } 

GifDecoderView: –

 public class GifDecoderView extends ImageView { private boolean mIsPlayingGif = false; private GifDecoder mGifDecoder; private Bitmap mTmpBitmap; final Handler mHandler = new Handler(); final Runnable mUpdateResults = new Runnable() { public void run() { if (mTmpBitmap != null && !mTmpBitmap.isRecycled()) { GifDecoderView.this.setImageBitmap(mTmpBitmap); } } }; public GifDecoderView(Context context, InputStream stream) { super(context); playGif(stream); } private void playGif(InputStream stream) { mGifDecoder = new GifDecoder(); mGifDecoder.read(stream); mIsPlayingGif = true; new Thread(new Runnable() { public void run() { final int n = mGifDecoder.getFrameCount(); final int ntimes = mGifDecoder.getLoopCount(); int repetitionCounter = 0; do { for (int i = 0; i < n; i++) { mTmpBitmap = mGifDecoder.getFrame(i); int t = mGifDecoder.getDelay(i); mHandler.post(mUpdateResults); try { Thread.sleep(t); } catch (InterruptedException e) { e.printStackTrace(); } } if(ntimes != 0) { repetitionCounter ++; } } while (mIsPlayingGif && (repetitionCounter <= ntimes)); } }).start(); } public void stopRendering() { mIsPlayingGif = true; } } 

GifMovieView: -

 public class GifMovieView extends View { private Movie mMovie; private long mMoviestart; public GifMovieView(Context context, InputStream stream) { super(context); mMovie = Movie.decodeStream(stream); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.TRANSPARENT); super.onDraw(canvas); final long now = SystemClock.uptimeMillis(); if (mMoviestart == 0) { mMoviestart = now; } final int relTime = (int)((now - mMoviestart) % mMovie.duration()); mMovie.setTime(relTime); mMovie.draw(canvas, 10, 10); this.invalidate(); } } 

GifWebView: -

 public class GifWebView extends WebView { public GifWebView(Context context, String path) { super(context); loadUrl(path); } } 

Ich denke, es könnte dir helfen ... 🙂

Fügen Sie in Ihrer build.gradle (Modul: app) android-gif-drawable als Abhängigkeit hinzu, indem Sie den folgenden Code hinzufügen:

 allprojects { repositories { mavenCentral() } } dependencies { compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.+' } 

Dann synchronisieren Sie Ihr Projekt. Wenn die Synchronisierung beendet ist, wechseln Sie zu Ihrer Layoutdatei und fügen Sie den folgenden Code hinzu:

   

Und das ist es, Sie können es mit einem einfachen ImageView verwalten.

Verwenden Sie Videoansicht.

Nativ unterstützt ImageView kein animiertes Bild. Sie haben zwei Möglichkeiten, animierte Gif-Dateien anzuzeigen

  1. Verwenden Sie VideoView
  2. Verwenden Sie ImageView und ImageView die gif-Datei in mehrere Teile und wenden Sie dann eine Animation darauf an

Zeige GIF in Android

Erstellen Sie CustomGifView.java which extends View Class

  public class CustomGifView extends View { private InputStream gifInputStream; private Movie gifMovie; private int movieWidth, movieHeight; private long movieDuration; private long mMovieStart; public CustomGifView(Context context) { super(context); init(context); } public CustomGifView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public CustomGifView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context){ setFocusable(true); gifInputStream = context.getResources() .openRawResource(R.drawable.YOUR_IMAGE); gifMovie = Movie.decodeStream(gifInputStream); movieWidth = gifMovie.width(); movieHeight = gifMovie.height(); movieDuration = gifMovie.duration(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(movieWidth, movieHeight); } public int getMovieWidth(){ return movieWidth; } public int getMovieHeight(){ return movieHeight; } public long getMovieDuration(){ return movieDuration; } @Override protected void onDraw(Canvas canvas) { long now = android.os.SystemClock.uptimeMillis(); if (mMovieStart == 0) { // first time mMovieStart = now; } if (gifMovie != null) { int dur = gifMovie.duration(); if (dur == 0) { dur = 1000; } int relTime = (int)((now - mMovieStart) % dur); gifMovie.setTime(relTime); gifMovie.draw(canvas, 0, 0); invalidate(); } } } 

Rufen Sie diese class jetzt in Ihrem XML auf

   

NP

Ändern Sie AndroidManifest.xml, um hardwareAccelerated auszuschalten.

  android:hardwareAccelerated="false" 

Referenz

Ein weiterer Trick

Für die Animationsfunktionalität, die Sie besuchen können

http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

Ich würde Ihnen empfehlen, Glide-Bibliothek zu verwenden. Um Glide zu verwenden, müssen Sie diese hinzufügen, um diese Abhängigkeiten hinzuzufügen

 compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:23.4.0' 

zu Ihrer Grandle (Modul: App) Datei.

Verwenden Sie dann diese Codezeile, um Ihr GIF-Bild zu laden

 Glide.with(context).load(R.drawable.loading).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(loadingImageView); 

Mehr Informationen über Gleiten

Basierend auf dem Kommentar von Ahmad Dwaik ‘Warlock habe ich den folgenden Code ausprobiert und es hat funktioniert.

  1. Verwenden Sie eine Webansicht in Ihrer XML-Datei, und passen Sie die Position an die Stelle an, an der Sie genau das GIF-Bild angezeigt haben.
  2. In Ihrer Aktivität initialisieren Sie dieses kleine Stück Webview wie andere Ansichten.
  3. Platzieren Sie das GIF-Bild im Ordner “Assets”
  4. Lade nun das Bild, als ob du eine URL in das Webview lädst wie “diyaWebView1.loadUrl (” file: ///android_asset/www/diya.gif “);”
  5. Sie können Ihr GIF-Bild beim Starten der Anwendung sehen.

PS: Diese Dinge funktionieren, wenn Sie .gif Bild passt zu Ihrem Webview oder umgekehrt, wenn das Bild größer als die Webansicht ist, wird die Bildlaufleiste aktiviert und der Benutzer kann das Bild AKA Webview scrollen. Wir müssen also vorsichtig sein, wenn wir dies verwenden, um dem Webview die richtige Größe gemäß Bild zu geben oder das Bild zu bearbeiten, das zu Ihrem Webview passt.

Verwenden Sie Webview, um gif Like as zu laden

 webView = (WebView) findViewById(R.id.webView); webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webView.getSettings().setLoadsImagesAutomatically(true); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/1.gif"); 

Wie @Ahmad in einem Kommentar sagte , können Sie einfach den folgenden Code verwenden, um ein gif anzuzeigen!

Setzen Sie einfach diesen Code in die onCreate-Methode und Sie können loslegen! Platziere dein Gif auch im Ordner ” assets ” (wenn du den Ordner “Assets” nicht hast, erzeuge einen unter ” src/main )

 WebView wView = new WebView(this); wView.loadUrl("file:///android_asset/piggy.gif"); setContentView(view); 

Wir können animierte Gif-Bilder auf Bildansichten mithilfe der Ion-Bibliothek hinzufügen.

Tutorial Video :: https://www.youtube.com/watch?v=IqKtpdeIpjA

 ImageView image = (ImageView)findViewById(R.id.image_gif); Ion.with(image).load("http://sofde.miximages.com/android/mygifimage.gif"); 

Das hat bei mir funktioniert:

Schreiben Sie in Ihrem build.gradle (Projekt) mavenCentral () in das Buildscript {} und alle Projekte {}. Es sollte so aussehen:

 buildscript { repositories { jcenter() **mavenCentral()** } //more code ... } allprojects { repositories { jcenter() **mavenCentral()** } } 

Dann fügen Sie in build.gradle (module) Abhängigkeiten {} dieses Snippet hinzu:

kompiliere ‘pl.droidsonroids.gif: android-gif-drawable: 1.2.4’

es sollte so aussehen:

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' **compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.4'** } 

Platzieren Sie Ihr GIF-Bild in Ihrem aufklappbaren Ordner. Gehen Sie nun zu app> res> layout> activity_main.xml und fügen Sie dieses für Ihre .gif hinzu:

  

Und du bist fertig 🙂

Hilfreiche Links: https://github.com/koral—/android-gif-drawable

https://www.youtube.com/watch?v=EOFY0cwNjuk

Hoffe das hilft.

GIFImageView

 public class GifImageView extends ImageView { Movie movie; InputStream inputStream; private long mMovieStart; public GifImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public GifImageView(Context context) { super(context); } public GifImageView(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); inputStream = context.getResources() .openRawResource(R.drawable.thunder); byte[] array = streamToBytes(inputStream); movie = Movie.decodeByteArray(array, 0, array.length); } private byte[] streamToBytes(InputStream is) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream( 1024); byte[] buffer = new byte[1024]; int len; try { while ((len = is.read(buffer)) >= 0) { byteArrayOutputStream.write(buffer, 0, len); return byteArrayOutputStream.toByteArray(); } } catch (Exception e) { e.printStackTrace(); return null; } return null; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); long now = SystemClock.uptimeMillis(); if (mMovieStart == 0) { // first time mMovieStart = now; } if (movie != null) { int dur = movie.duration(); if (dur == 0) { dur = 3000; } int relTime = (int) ((now - mMovieStart) % dur); movie.setTime(relTime); movie.draw(canvas, getWidth() - 200, getHeight() - 200); invalidate(); } } } 

In XML

     

In Java-Datei

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GifImageView gifImageView = (GifImageView) findViewById(R.id.gifImageView1); if (Build.VERSION.SDK_INT >= 11) { gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } } 

Wir müssen gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); Wenn die Hardwarebeschleunigung aktiviert ist, funktioniert das GIF-Bild auf diesen Geräten nicht. Hardwarebeschleunigung ist auf Geräten über (4.x) aktiviert.

Sie können jedes gif Bild über die Bibliothek Fresco by Facebook anzeigen:

 Uri uri = Uri.parse("http://sofde.miximages.com/android/awersome.gif"); final SimpleDraweeView draweeView = new SimpleDraweeView(context); final LinearLayout.LayoutParams params = new LinearLayout.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 

Fügen Sie zunächst eine Abhängigkeit in der Datei module:app build.gradle hinzu

 compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+' 

Dann in der Layoutdatei

  

Gifs können auch in der Webansicht mit einigen Codezeilen und ohne Bibliotheken von Drittanbietern angezeigt werden. Auf diese Weise können Sie sogar das gif von Ihrer SD-Karte laden. Sie müssen keine Bilder in Ihren Asset-Ordner kopieren.

Nimm eine Webansicht.

  

Die Verwendung kann eine gif-Datei von der SD-Karte nicht nur aus dem Asset-Ordner öffnen, wie in vielen Beispielen gezeigt.

  WebView webView = (WebView) findViewById(R.id.imageWebView); String data = " "; // 'filePath' is the path of your .GIF file on SD card. webView.loadDataWithBaseURL("file:///android_asset/",data,"text/html","UTF-8",null); 
 import android.app.Activity; import android.util.Log; import android.widget.ImageView; /** * Created by atiq.mumtaz on 25.04.2016. */ public class GifImage_Player extends Thread { Activity activity; ImageView image_view; boolean is_running=false; int pause_time; int[] drawables; public GifImage_Player(Activity activity,ImageView img_view,int[] drawable) { this.activity=activity; this.image_view=img_view; this.is_running=true; pause_time=25; this.drawables=drawable; } public void set_pause_time(int interval) { this.pause_time=interval; } public void stop_playing() { this.is_running=false; } public void run() { Log.d("Gif Player","Gif Player Stopped"); int pointer=0; while (this.is_running) { if(drawables.length>0) { if((drawables.length-1)==pointer) { pointer=0; } try { activity.runOnUiThread(new Run(pointer)); Thread.sleep(pause_time); } catch (Exception e) { Log.d("GifPlayer","Exception: "+e.getMessage()); is_running=false; } pointer++; } } Log.d("Gif Player","Gif Player Stopped"); } class Run implements Runnable { int pointer; public Run(int pointer) { this.pointer=pointer; } public void run() { image_view.setImageResource(drawables[pointer]); } } } /////////////////////////////Usage/////////////////////////////////////// int[] int_array=new int[]{R.drawable.tmp_0,R.drawable.tmp_1,R.drawable.tmp_2,R.drawable.tmp_3 ,R.drawable.tmp_4,R.drawable.tmp_5,R.drawable.tmp_6,R.drawable.tmp_7,R.drawable.tmp_8,R.drawable.tmp_9, R.drawable.tmp_10,R.drawable.tmp_11,R.drawable.tmp_12,R.drawable.tmp_13,R.drawable.tmp_14,R.drawable.tmp_15, R.drawable.tmp_16,R.drawable.tmp_17,R.drawable.tmp_18,R.drawable.tmp_19,R.drawable.tmp_20,R.drawable.tmp_21,R.drawable.tmp_22,R.drawable.tmp_23}; GifImage_Player gif_player; gif_player=new GifImage_Player(this,(ImageView)findViewById(R.id.mygif),int_array); gif_player.start();