Adding gif image in an ImageView in android

I added an animated gif image in an imageView. I am not able to view it as a gif image. No animation is there. It’s appearing just as a still image. I would like to know how can i show it as a gif image.

  • Can I use glu with Android NDK
  • Confusion: How does SQLiteOpenHelper onUpgrade() behave? And together with import of an old database backup?
  • Eclipse stops highlighting references after a while
  • Debugger disconnecting in Android Studio when debugging a home screen widget
  • How do I get Dagger and Butterknife working with Gradle?
  • java.lang.ClassNotFoundException: Didn't find class on path: dexpathlist
  • Related posts:

    How to provide custom animation during sorting (notifyDataSetChanged) on RecyclerView
    CountDownTimer.cancel() is not working in Android
    Last Harka is showing before the first character of the line in Arabic Reshaper on Android
    What does android:isScrollContainer do?
    Cursor size limit in Android SQLiteDatabase
    Android MediaPlayer OnPreparedListener
  • Create Android library AAR including javadoc and sources
  • How To Display Border To Imageview?
  • Android ViewPager with bottom dots
  • Android studio not refreshing new versions
  • How to set editable true/false EditText in Android programmatically?
  • Android or Java class naming with $ symbol
  • 15 Solutions collect form web for “Adding gif image in an ImageView in android”

    First copy your GIF image into Asset Folder of your app
    create create following classes and paste the code
    AnimationActivity: –

    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<GifFrame> 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<GifFrame>();
                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);
    }
    }
    

    I Think It Might Help You… 🙂

    In your build.gradle(Module:app), add android-gif-drawable as a dependency by adding the following code:

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

    Then sync your project.
    When synchronization ends, go to your layout file and add the following code:

    <pl.droidsonroids.gif.GifTextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gif_file"
        />
    

    And that’s it, you can manage it with a simple ImageView.

    Use VideoView.

    Natively ImageView does not support animated image. You have two options to show animated gif file

    1. Use VideoView
    2. Use ImageView and Split the gif file into several parts and then apply animation to it

    Showing GIF In Android

    Create 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();
    
            }
    
     }
    
     }
    

    Now call this class in your XML

     <Your_PackageName.CustomGifView
            android:id="@+id/gifview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    

    N.P

    Modify AndroidManifest.xml to turn OFF hardwareAccelerated.

     android:hardwareAccelerated="false"
    

    Reference

    Another Tricks

    For animation functionality you may visit

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

    Based on Ahmad Dwaik ‘Warlock’s comment, I have tried the following code and it worked.

    1. Use a webview in your xml file, and adjust its position to the place where exactly you were trying to show you .gif image.
    2. In your activity initialise this small piece of webview like other views.
    3. place the .gif image in assets folder
    4. now load the image as if you are loading a url into webview like “diyaWebView1.loadUrl(“file:///android_asset/www/diya.gif”);”
    5. you can see your .gif image when you launch the application.

    P.S : this things works if you .gif image fits your webview or viceversa else if the image is bigger than the webview the scrollbar gets enabled and user can scroll the image AKA webview. So we need to be careful when we use this, to give proper size to the webview as per image or edit the image that fits your webview.

    I would suggest you to use Glide library. To use Glide you need to add this to add these dependencies

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

    to your grandle (Module:app) file.

    Then use this line of code to load your gif image

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

    More Information on Glide

    We can easily add animated gif image on imageview using Ion library.

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

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

    As @Ahmad said in a comment, you can just use the following code to display a gif!

    Just simply pop this code in the onCreate method and your good to go! Also place your gif inside the assets folder.

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

    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

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
        <TextView
            android:id="@+id/update"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="abc" /> 
    
        <com.example.apptracker.GifImageView
            android:id="@+id/gifImageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true" />
    
    </RelativeLayout>
    

    In Java File

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

    We need to use gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); as when hardware accelerated enabled, GIF image not work on those device. Hardware accelerated is enabled on devices above(4.x).

    You can display any gif image via library Fresco by Facebook:

    Uri uri = Uri.parse("http://domain.com/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
    

    Use Webview to load gif like as

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

    This is what worked for me:

    In your build.gradle (project) write mavenCentral() in the buildscript{} and allprojects {}. It should look like this:

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

    Then, in build.gradle(module) add in dependencies{} this snippet:

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

    it should look like this:

    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'**
    }
    

    Put your .gif image in your drawable folder.
    Now go to app > res > layout > activity_main.xml and add this snipped for your .gif:

    <pl.droidsonroids.gif.GifImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/YOUR_GIF_IMAGE"
        android:background="#000000" //for black background
        />
    

    And you’re done 🙂

    Helpful links:
    https://github.com/koral–/android-gif-drawable

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

    Hope this helps.

    Gif’s can also be displayed in web view with couple of lines of code and without any 3rd party libraries.
    This way you can even load the gif from your SD card. No need to copy images to your Asset folder.

    Take a web view.

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

    Use can open a gif file from SD card not just from asset folder as shown in many examples.

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

    Firstly add a dependency in the module:app build.gradle file

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

    Then, in the layout file

    <pl.droidsonroids.gif.GifImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/mq_app"
            />
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.