在android的ImageView中添加gif图像
Posted
技术标签:
【中文标题】在android的ImageView中添加gif图像【英文标题】:Adding gif image in an ImageView in android 【发布时间】:2011-09-25 21:51:52 【问题描述】:我在 imageView 中添加了一个动画 gif 图像。我无法将其视为 gif 图像。没有动画。它以静止图像的形式出现。我想知道如何将其显示为 gif 图像。
【问题讨论】:
请检查下面的链接可能对你有帮助***.com/questions/3660209/…***.com/questions/3691726/… 使用这个链接它简单/易于使用和最好的。 http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html 如果您只想将 gif 图像添加到 imageview 中,而不是在 webview 中使用它对我来说很好***.com/a/29488519/3514144 这里是您问题的答案链接***.com/questions/35147375/… 【参考方案1】:在您的 build.gradle(Module:app) 中,通过添加以下代码将 android-gif-drawable
添加为依赖项:
allprojects
repositories
mavenCentral()
dependencies
compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'
更新:从Android Gradle Plugin 3.0.0开始,新的编译命令是
implementation
,所以上面的行可能需要修改为:
dependencies
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17'
然后同步您的项目。 同步结束后,转到您的布局文件并添加以下代码:
<pl.droidsonroids.gif.GifImageView
android:layout_
android:layout_
android:src="@drawable/gif_file"
/>
就是这样,你可以用一个简单的 ImageView 来管理它。
【讨论】:
这个答案是最好的答案,它对我来说非常顺利,我尝试了不同的东西并建立了课程,在我发现这个之后令人难以置信......谢谢先生;) 平滑,比 gif 滑行更好 对我来说也是最好的,在 10 秒内实现 不应该改用pl.droidsonroids.gif.GifImageView
吗?
我建议不要使用pl.droidsonroids.gif.GifImageView
。在不断遇到该库中严重的安全问题和错误后,我们将其从我们的应用程序中删除。还有其他选择,请参阅其他答案。【参考方案2】:
首先,将您的 GIF 图片复制到您应用的资产文件夹中 创建以下类并粘贴代码 动画活动:-
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);
我认为它可能会对您有所帮助...:)
【讨论】:
基本上你不需要所有这些,因为你创建了解码器和复杂的代码并且从不使用它!您正在使用 GifWebView view = new GifWebView(this, "file:///android_asset /piggy.gif");它调用了一个没有自定义 webview 的 webview 子类,您可以用 3 行替换整个代码。 webView wView = new webView(this); wView.loadUrl("file:///android_asset/piggy.gif");设置内容视图(视图); 嘿,谢谢您的回答..:) 它工作得很好!但是我对 webview(在 GifWebView 类中)有一个问题,它显示的 gif 文件大于设备屏幕。那么如何为该视图提供自定义宽度和高度,否则我可以使用任何其他视图??? 这只会播放我的 gif 一次吗?它不会继续循环通过 gif 吗???无论如何我可以重新运行方法以再次显示它吗? 请帮我解决这个问题:***.com/questions/32996878/… 这适用于我在 4.4 上运行的设备,但是当我在 Lollipop 设备 (5.1) 上运行它时,Gif 不会动画。【参考方案3】:在android中显示GIF文件
在您的 build.gradle 文件中添加以下依赖项。
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'
在布局 - activity_xxxxx.xml
文件中添加 GifImageview
如下。
<pl.droidsonroids.gif.GifImageView
android:id="@+id/CorrWrong"
android:layout_
android:layout_/>
在您的 Java 文件中,您可以访问以下 gif。
GifImageView emoji;
emoji = (GifImageView)findViewById(R.id.CorrWrong);
【讨论】:
【参考方案4】:我遇到了使用问题
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
而且我也找不到要添加到我的项目中的 jar 文件。 所以,为了显示 gif,我像这样使用 WebView:
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);
【讨论】:
【参考方案5】:带有最新的Glide 库
使用 Gradle:
repositories
mavenCentral()
google()
dependencies
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
在活动或片段中:
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);
【讨论】:
【参考方案6】:作为@Ahmad said in a comment,你可以使用下面的代码来显示一个gif!
只需在 onCreate 方法中弹出此代码即可!另外,将您的 gif 文件放在 assets
文件夹中(如果您没有 assets 文件夹,请在 src/main
下创建一个)
WebView wView = new WebView(this);
wView.loadUrl("file:///android_asset/piggy.gif");
setContentView(view);
【讨论】:
【参考方案7】:首先在module:app
build.gradle文件中添加一个依赖
compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.+'
然后,在布局文件中
<pl.droidsonroids.gif.GifImageView
android:layout_
android:layout_
android:background="@drawable/mq_app"
/>
【讨论】:
【参考方案8】:这对我有用:
在您的 build.gradle(项目)中,在 buildscript 和 allprojects 中编写 mavenCentral()。它应该是这样的:
buildscript
repositories
jcenter()
**mavenCentral()**
//more code ...
allprojects
repositories
jcenter()
**mavenCentral()**
然后,在 build.gradle(module) 中添加依赖项这个 sn-p:
编译'pl.droidsonroids.gif:android-gif-drawable:1.2.4'
应该是这样的:
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'**
将您的 .gif 图像放入您的可绘制文件夹中。 现在转到 app > res > layout > activity_main.xml 并为您的 .gif 添加此片段:
<pl.droidsonroids.gif.GifImageView
android:layout_
android:layout_
android:src="@drawable/YOUR_GIF_IMAGE"
android:background="#000000" //for black background
/>
你已经完成了:)
有用的链接: https://github.com/koral--/android-gif-drawable
https://www.youtube.com/watch?v=EOFY0cwNjuk
希望这会有所帮助。
【讨论】:
【参考方案9】:基于Ahmad Dwaik 'Warlock's comment,我尝试了以下代码并且它有效。
-
在您的 xml 文件中使用 webview,并将其位置调整到您想要显示 .gif 图像的位置。
在您的活动中,像其他视图一样初始化这一小块 web 视图。
将 .gif 图片放在 assets 文件夹中
现在加载图像,就像您将 url 加载到 webview 中一样“diyaWebView1.loadUrl("file:///android_asset/www/diya.gif");"
您可以在启动应用程序时看到您的 .gif 图像。
P.S:如果您的 .gif 图像适合您的 webview,则此方法有效,反之亦然,如果图像大于 webview,则启用滚动条并且用户可以滚动图像 AKA webview。所以我们在使用它时需要小心,根据图像为 webview 提供适当的大小或编辑适合您 webview 的图像。
【讨论】:
【参考方案10】:使用 Webview 像 as 一样加载 gif
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");
【讨论】:
请记住图像名称区分大小写。我的以 GIF 结尾,当我打电话给image.gif
时它不起作用【参考方案11】:
我建议你使用 Glide 库。要使用 Glide,你需要添加这个来添加这些依赖项
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:23.4.0'
到您的 Grandle (Module:app) 文件。
然后用这行代码来加载你的gif图片
Glide.with(context).load(R.drawable.loading).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).crossFade().into(loadingImageView);
More Information on Glide
【讨论】:
【参考方案12】: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();
【讨论】:
【参考方案13】:您可以通过库Fresco by Facebook显示任何gif图像:
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
【讨论】:
【参考方案14】:Gif 也可以在 Web 视图中显示,只需几行代码,无需任何 3rd 方库。 这样您甚至可以从 SD 卡加载 gif。无需将图像复制到您的资产文件夹。
浏览网页。
<WebView
android:layout_
android:layout_
android:id="@+id/imageWebView" />
使用可以从 SD 卡打开 gif 文件,而不仅仅是从资产文件夹中打开,如许多示例所示。
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);
【讨论】:
【参考方案15】:在 Android 中显示 GIF
创建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();
现在在你的 XML 中调用这个类
<Your_PackageName.CustomGifView
android:id="@+id/gifview"
android:layout_
android:layout_ />
N.P
修改 AndroidManifest.xml 以关闭 hardwareAccelerated。
android:hardwareAccelerated="false"
Reference
Another Tricks
有关动画功能,您可以访问
http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
【讨论】:
运行良好!您知道实现此功能的最低 API 级别吗? @KhanSquare 可能是 15 @Lakhan 在这里工作正常。好的,我会再检查一次 根据我在下面给出的 kimmi dhingra 的回答 if (Build.VERSION.SDK_INT >= 11) gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); @IntelliJAmiya 是的,这也会帮助其他人【参考方案16】:我们可以使用 Ion 库在 imageview 上轻松添加动画 gif 图像。
教程视频::https://www.youtube.com/watch?v=IqKtpdeIpjA
ImageView image = (ImageView)findViewById(R.id.image_gif);
Ion.with(image).load("http://mygifimage.gif");
【讨论】:
【参考方案17】: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();
在 XML 中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_
android:layout_ >
<TextView
android:id="@+id/update"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:text="abc" />
<com.example.apptracker.GifImageView
android:id="@+id/gifImageView1"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
在 Java 文件中
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);
我们需要使用gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
,因为当启用硬件加速时,GIF 图像无法在这些设备上运行。在以上(4.x)的设备上启用了硬件加速。
【讨论】:
这并没有显示任何东西。可以分享到 Github 上吗?【参考方案18】:使用 VideoView。
ImageView 本身不支持动画图像。您有两个选项来显示动画 gif 文件
-
使用
VideoView
使用ImageView
将gif文件拆分成几个部分,然后对其应用动画
【讨论】:
我如何使用 VideoView。我可以在那个 VideoView 中显示特定的 gif 图像吗 如何使用 VideoView?如果我将路径设置为 Gif,它将无法正常工作。 我也没有明白VideoView
怎么可以用来显示动画GIF?
忘记 gif 并使用视频制作动画。我想就是这样。不确定这是不是问题的答案。
@Sunil Kumar Sahoo 你没有回复任何用户的评论!以上是关于在android的ImageView中添加gif图像的主要内容,如果未能解决你的问题,请参考以下文章