在 android 中的 ImageView 中添加 gif 图像

我在 imageView 中添加了一个动画的 gif 图像。我无法将其视为一个 gif 图像。没有动画。它看起来就像一个静止的图像。我想知道如何才能显示它作为一个 gif 图像。

386941 次浏览

使用 视像。

本地 ImageView 不支持动画图像。您有两个选项来显示动画 gif 文件

  1. 使用 VideoView
  2. 使用 ImageView并将 gif 文件拆分成几个部分,然后对其应用动画效果

首先,将 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);
}
}

GifDecder:-

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

我想这可能对你有帮助

基于 艾哈迈德 · 德瓦克术士的评论,我尝试了下面的代码,它工作。

  1. 在 xml 文件中使用 webview,并将其位置调整到您想要显示的位置。GIF 图像。
  2. 在你的活动初始化这个小片段像其他视图。
  3. 将.gif 图像放在资产文件夹中
  4. 现在加载图片,就好像你正在加载一个像“ diyaWebView1.loadUrl (“ file:///android _ asset/www/diya.gif”) ;
  5. 当您启动应用程序时,您可以看到您的.gif 映像。

附注: 如果你。Gif 图片适合你的网络视图或反之亦然如果图片比网络视图大滚动条得到启用,用户可以滚动图片 AKA 网络视图。因此,我们需要小心,当我们使用这一点,给予适当的大小,每个图像或编辑图像,适合您的网络视图。

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_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>

在 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)设备上启用。

我们可以很容易地添加动画 gif 图像的图像视图使用离子库。

教程视频: : https://www.youtube.com/watch?v=IqKtpdeIpjA

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

在 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_width="wrap_content"
android:layout_height="wrap_content" />

不适用

修改 AndroidManifest.xml 以关闭硬件加速。

 android:hardwareAccelerated="false"

参考文献

另一个把戏

对于动画功能,您可以访问

Http://developer.android.com/reference/android/graphics/drawable/animationdrawable.html

作为 @ Ahmad 在评论中说,您可以只使用下面的代码来显示 gif!

只需在 onCreate 方法中弹出这段代码,就可以开始了!另外,将 gif 放在 assets文件夹中(如果没有资产文件夹,请在 src/main下创建一个)

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

GIF 的也可以显示在网络视图与夫妇的代码行,没有任何第三方库。 这样你甚至可以从你的 SD 卡加载 gif。无需复制图像到您的资产文件夹。

浏览一下网页。

<WebView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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);

您可以通过库 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

在 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_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/gif_file"
/>

就是这样,你可以用一个简单的 ImageView 来管理它。

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

我建议您使用 Glide 库。要使用 Glide,您需要添加这个来添加这些依赖项

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

到您的大(模块: 应用程序)文件。

然后使用这行代码加载 gif 图像

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

更多关于滑翔的资料

使用 Webview 加载 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");

这就是对我有效的方法:

在 build.gradle (project)中,在 buildscript {}和 allproject {}中编写 mavenCentral ():

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

然后,在 build.gradle (模块)中添加依赖项{}这个片段:

编译‘ pl.droidsonroids.gif: android-gif-draable: 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 > lay> activity _ main.xml,并为您的. 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
/>

然后你就完蛋了:)

有用链接: Https://github.com/koral——/android-gif-drawable

Https://www.youtube.com/watch?v=eofy0cwnjuk

希望这个能帮上忙。

首先在 module:app build.gradle 文件中添加一个依赖项

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

然后,在布局文件中

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

最新的 滑行

使用分级:

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

我遇到了难题

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

在机器人中显示 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_width="100dp"
android:layout_height="75dp"/>

在 Java 文件中,您可以访问下面的 gif。

 GifImageView emoji;
emoji = (GifImageView)findViewById(R.id.CorrWrong);