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.
-
1Please check below link may be helpful to you http://stackoverflow.com/questions/3660209/android-display-animated-gif http://stackoverflow.com/questions/3691726/problem-with-animated-gif-on-android – Nikhil Jun 30 '11 at 11:28
-
if you exactly want to add gif image into imageview only ,not in webview than use this its work fine for me http://stackoverflow.com/a/29488519/3514144 – Ajay Pandya Apr 07 '15 at 12:43
-
Use this link its simple/easy to use and best. [http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html](http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html) – Muhammad Aamir Ali Dec 08 '14 at 08:06
-
here is the answer link to your question https://stackoverflow.com/questions/35147375/gif-support-in-react-native-android/40717833#40717833 – Venkatesh Somu Jul 26 '17 at 13:50
19 Answers
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.+'
}
UPDATE: As of Android Gradle Plugin 3.0.0, the new command for compiling is
implementation
, so the above line might have to be changed to:
dependencies {
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17'
}
Then sync your project. When synchronization ends, go to your layout file and add the following code:
<pl.droidsonroids.gif.GifImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/gif_file"
/>
And that's it, you can manage it with a simple ImageView.

- 5,034
- 2
- 20
- 43

- 2,962
- 2
- 11
- 7
-
14This answer is the best answer and it works very smooth for me, I tried different thing and build classes and unbelievable after I found this.... Thanks mister ;) – Alexiscanny Feb 16 '16 at 10:59
-
-
-
Not working for me!!! device shows a gray screen Please help.I have inserted the xml code in activity.xml under framelayout – Nitish Chopra Jun 22 '16 at 19:25
-
4
-
Its worked awsom, But if i need repeat animation of GIF then what should i do? – Mohit Suthar Oct 07 '16 at 10:31
-
pl.droidsonroids.gif.GifTextView cannot be cast to android.widget.ImageView – Zac Dec 24 '17 at 19:28
-
Perfect answer but `GifImageView` should be used instead and `android:src` not `android:background` – CAllen Jul 10 '18 at 14:39
-
NOTE: To make the gif loop, see here https://github.com/koral--/android-gif-drawable/issues/564#issuecomment-403423690 – Nathan F. Jun 03 '19 at 23:24
-
3I recommend against using `pl.droidsonroids.gif.GifImageView`. We pulled it from our app after being continuously confronted with severe security issues and bugs in that library. There are alternatives, see other answers. – Manuel Feb 09 '20 at 17:34
-
this does not work on notifications right? i guess not since notifications only accept RemoteView? – cesarmax Feb 26 '20 at 13:18
-
Unlike @Manuel, I do recommend `pl.droidsonroids.gif.GifImageView`. I tried the library and it works great with no extra configuration whatsoever. Maybe it has some issues in the past, but currently it does its job very well. – Xam Apr 03 '22 at 00:29
-
First, copy your GIF image into Asset Folder of your app 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... :)

- 628
- 11
- 24

- 1,751
- 13
- 14
-
77basically you dont need all of that since you create decoders and comlex code and never use it! you are using GifWebView view = new GifWebView(this, "file:///android_asset /piggy.gif"); which calls a subclass of webview which has no customization to webview, you can replace this whole code with 3 lines.. webView wView = new webView(this); wView.loadUrl("file:///android_asset/piggy.gif"); setContentView(view); – Ahmad Dwaik 'Warlock' Oct 08 '13 at 06:26
-
2Hey thanks for your answer..:) its working nice !! but I have one issue with webview (in GifWebView class) its displaying the gif file larger than the device screen. so how to provide custom width and height for that view OR else I can use any other view??? – Android learner Aug 14 '14 at 13:00
-
This will only play my gif once? It won't keep cycling through the gif??? Is there anyway I can re-run the methods to display it again? – James111 Oct 06 '15 at 06:55
-
please help me with this: http://stackoverflow.com/questions/32996878/showing-gif-image-with-library – Twitter khuong291 Oct 07 '15 at 17:06
-
This works for my device running on 4.4, but when I ran it on a Lollipop device (5.1) the Gif does not animate. – vikzilla Nov 05 '15 at 22:35
-
@AhmadDwaik'Warlock' thank you very much. I'm sick and tired from popular image library bugs: fresco plays gif slow, default `imageView` often crashes with OOM (I divide my gif on frames and tried to use `animation-list`). This is most laconic solution! – IliaEremin Apr 01 '16 at 08:19
-
-
when using webview nl need to use the whole other codes, to use the decider long code you need to do InputStream stream = null; try { stream = getAssets().open("gif1.gif"); } catch (IOException e) { e.printStackTrace(); } GifDecoderView view = new GifDecoderView(this, stream); linear1.addView(view); – Hasni Sep 13 '21 at 21:02
-
Why aren't all gif files with animation displayed correctly? After GifDecoder, some textures have only the upper part of the image, and the lower part of the texture is filled with white. Please tell me what it could be? How i can fix it? – Chego Apr 25 '22 at 01:57
with latest Glide library
use Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
in activity or fragment:
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);

- 3,863
- 1
- 25
- 16
Use VideoView.
Natively ImageView does not support animated image. You have two options to show animated gif file
- Use
VideoView
- Use
ImageView
and Split the gif file into several parts and then apply animation to it

- 2,058
- 2
- 20
- 30

- 53,011
- 55
- 178
- 243
-
8How i can use VideoView. Can i show the particular gif image in that VideoView – Kamalone Jun 30 '11 at 11:40
-
1How can you use VideoView? If I set the path to a Gif it simply won't work. – entropid Jan 18 '14 at 04:03
-
I also did not get how `VideoView` can be used to display the animated GIF ? – Ajay S Mar 05 '14 at 19:14
-
Forget the gif and use a video for animation. I think that is how. Not sure it is an answer to the question though. – Krishnabhadra Jul 18 '16 at 06:01
-
-
@SunilKumarSahoo You gave the same answer as Armando Esparza Garcia http://stackoverflow.com/a/35273824/247696 – Flimm Oct 07 '16 at 10:40
-
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"
For animation functionality you may visit
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

- 74,896
- 15
- 165
- 198
-
1
-
-
-
-
1as per kimmi dhingra's answer below i gave if (Build.VERSION.SDK_INT >= 11) { gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } – Aditya Vyas-Lakhan Jan 12 '16 at 11:04
-
-
1
-
@IntelliJAmiya why does the app crash without `android:hardwareAccelerated="false"` ? – mrid Jul 06 '17 at 18:30
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);

- 957
- 12
- 26
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");

- 6,548
- 8
- 42
- 69

- 91
- 1
- 1
-
Keep in mind image name is case sensitive. Mine ends with **GIF** and it didn't work when I called `image.gif` – Sam May 03 '18 at 16:37
Based on Ahmad Dwaik 'Warlock's comment, I have tried the following code and it worked.
- Use a webview in your xml file, and adjust its position to the place where exactly you were trying to show you .gif image.
- In your activity initialise this small piece of webview like other views.
- place the .gif image in assets folder
- now load the image as if you are loading a url into webview like "diyaWebView1.loadUrl("file:///android_asset/www/diya.gif");"
- 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.
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 you're good to go! Also, place your gif inside the assets
folder (if you don't have the assets folder, create one under src/main
)
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).

- 2,249
- 22
- 21
-
This doesn't show me anything. Can you please share it on Github? – android developer Apr 20 '18 at 11:46
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");

- 331,213
- 40
- 305
- 339

- 81
- 2
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.

- 396
- 4
- 8
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

- 4,435
- 2
- 38
- 85
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"
/>

- 4,513
- 9
- 31
- 51

- 1,241
- 13
- 11
Display GIF file in android
Add the following dependency in your build.gradle file.
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'
In the layout - activity_xxxxx.xml
file add the GifImageview
as below.
<pl.droidsonroids.gif.GifImageView
android:id="@+id/CorrWrong"
android:layout_width="100dp"
android:layout_height="75dp"/>
In your Java file , u can access the gif as below.
GifImageView emoji;
emoji = (GifImageView)findViewById(R.id.CorrWrong);

- 8,281
- 3
- 24
- 35

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

- 7,794
- 4
- 48
- 44
I faced problem to use
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
And also I could not find the jar file to add to my project. So, in order to show gif, I use WebView like this:
WebView webView = (WebView) this.findViewById(R.id.webView);
webView.loadDataWithBaseURL(null, "<html><body><center><img style='align:center;width:250px; height:250px; border-radius:50%' src='file:///android_asset/loading.gif'/></center></body></html>", "text/html", "UTF-8", "");
webView.setBackgroundColor(Color.TRANSPARENT);

- 338
- 1
- 5
- 16
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();

- 11
- 1