Thêm hình ảnh gif trong ImageView trong Android


135

Tôi đã thêm một hình ảnh gif hoạt hình trong một imageView. Tôi không thể xem nó như một hình ảnh gif. Không có hoạt hình là có. Nó xuất hiện như một hình ảnh tĩnh. Tôi muốn biết làm thế nào tôi có thể hiển thị nó như một hình ảnh gif.


1
Vui lòng kiểm tra liên kết bên dưới có thể hữu ích cho bạn stackoverflow.com/questions/3660209/ nam stackoverflow.com/questions/3691726/iêu
Nikhil

Sử dụng liên kết này đơn giản / dễ sử dụng và tốt nhất. http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-l
Library-for.html

nếu bạn chính xác chỉ muốn thêm hình ảnh gif vào chế độ xem hình ảnh, không phải trong chế độ xem web hơn thì hãy sử dụng công cụ này tốt cho tôi stackoverflow.com/a/2948851935314144
Ajay Pandya

đây là liên kết câu trả lời cho câu hỏi stackoverflow.com/questions353147/375
Venkatesh Somu

Câu trả lời:


79

Đầu tiên, sao chép hình ảnh GIF của bạn vào Thư mục tài sản của ứng dụng của bạn tạo các lớp sau và dán mã 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);
}
}

Tôi nghĩ nó có thể giúp bạn ... :)


72
về cơ bản, bạn không cần tất cả điều đó vì bạn tạo bộ giải mã và mã comlex và không bao giờ sử dụng nó! bạn đang sử dụng GifWebView view = new GifWebView (this, "file: /// android_asset /piggy.gif"); trong đó gọi một lớp con của webview không có tùy chỉnh cho webview, bạn có thể thay thế toàn bộ mã này bằng 3 dòng .. webView wView = new webView (this); wView.loadUrl ("tệp: ///android_asset/piggy.gif"); setContentView (xem);
Ahmad Dwaik 'Warlock'

2
Hey cảm ơn câu trả lời của bạn .. :) nó hoạt động tốt !! nhưng tôi có một vấn đề với webview (trong lớp GifWebView) nó hiển thị tệp gif lớn hơn màn hình thiết bị. Vậy làm thế nào để cung cấp chiều rộng và chiều cao tùy chỉnh cho chế độ xem đó HOẶC khác tôi có thể sử dụng bất kỳ chế độ xem nào khác không ???
học Android

Điều này sẽ chỉ chơi gif của tôi một lần? Nó sẽ không tiếp tục đạp xe qua gif ??? Có cách nào tôi có thể chạy lại các phương thức để hiển thị lại không?
James111

vui lòng giúp tôi với điều này: stackoverflow.com/questions/32996878/iêu
Khương

Điều này hoạt động cho thiết bị của tôi chạy trên 4.4, nhưng khi tôi chạy nó trên thiết bị Lollipop (5.1), Gif không hoạt động.
vikzilla

217

Trong build.gradle của bạn (Mô-đun: ứng dụng), thêm android-gif-drawabledưới dạng phụ thuộc bằng cách thêm mã sau đây:

allprojects {
    repositories {
       mavenCentral()
    }
}

dependencies {
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'
}


CẬP NHẬT : Kể từ Android Gradle Plugin 3.0.0 , lệnh mới để biên dịch là implementation, vì vậy dòng trên có thể phải được thay đổi thành:

dependencies {
    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.17'
}

Sau đó đồng bộ hóa dự án của bạn. Khi đồng bộ hóa kết thúc, hãy chuyển đến tệp bố cục của bạn và thêm mã sau đây:

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

Và đó là nó, bạn có thể quản lý nó với một ImageView đơn giản.


9
Câu trả lời này là câu trả lời tốt nhất và nó hoạt động rất trơn tru đối với tôi, tôi đã thử nhiều thứ khác nhau và xây dựng các lớp học và không thể tin được sau khi tôi tìm thấy điều này .... Cảm ơn ngài;)
Alexiscanny 16/2/2016

mịn màng, tốt hơn sau đó lướt qua cho gif
Himanshu Shekher Jha

1
Cũng là điều tốt nhất cho tôi, được thực hiện trong 10 giây
Diogo Garcia

bước đơn giản. đây sẽ là câu trả lời thực hiện trong vài phút
nắng

3
Không nên pl.droidsonroids.gif.GifImageViewsử dụng thay thế?
Flimm

23

Sử dụng VideoView.

Bản chất ImageView không hỗ trợ hình ảnh hoạt hình. Bạn có hai tùy chọn để hiển thị tệp gif hoạt hình

  1. Sử dụng VideoView
  2. Sử dụng ImageViewvà Chia tệp gif thành nhiều phần và sau đó áp dụng hình ảnh động cho nó

8
Làm thế nào tôi có thể sử dụng VideoView. Tôi có thể hiển thị hình ảnh gif cụ thể trong VideoView đó không
Kamsters

Làm thế nào bạn có thể sử dụng VideoView? Nếu tôi đặt đường dẫn đến Gif, đơn giản là nó sẽ không hoạt động.
entropid

Tôi cũng không hiểu làm thế nào VideoViewcó thể được sử dụng để hiển thị GIF hoạt hình?
Ajay S

Quên gif và sử dụng video cho hình ảnh động. Tôi nghĩ đó là cách. Không chắc chắn đó là một câu trả lời cho câu hỏi mặc dù.
Krishnabhadra

@Sunil Kumar Sahoo bạn không trả lời bất kỳ bình luận nào của người dùng!
dùng

16

với thư viện Glide mới nhất

sử dụng Gradle:

repositories {
  mavenCentral()
  google()
}

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.8.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

trong hoạt động hoặc đoạn:

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

12

Hiển thị GIF trong Android

Tạo nên 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();

        }

 }

 }

Bây giờ gọi lớp này trong XML của bạn

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

NP

Sửa đổi AndroidManifest.xml để TẮT phần cứngAccelerated.

 android:hardwareAccelerated="false"

Tài liệu tham khảo

Thủ thuật khác

Đối với chức năng hoạt hình bạn có thể truy cập

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


1
Làm việc tốt! Bạn có biết mức API tối thiểu để thực hiện việc này không?
Khan

@KhanSapes Có lẽ là 15
IntelliJ Amiya

@Lakhan Ở đây nó hoạt động tốt. Hôm nay tôi sẽ kiểm tra lại
IntelliJ Amiya

1
theo câu trả lời của kimmi d Breathra dưới đây tôi đã đưa ra nếu (Build.VERSION.SDK_INT> = 11) {gifImageView.setLayerType (View.LAYER_TYPE_SOFTWARE, null); }
Aditya Vyas-Lakhan

1
@IntelliJAmiya yeah cũng sẽ giúp người khác
Aditya Vyas-Lakhan

10

Tôi sẽ đề nghị bạn sử dụng thư viện Glide. Để sử dụng Glide, bạn cần thêm phần này để thêm các phụ thuộc này

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

vào tập tin grandle (Module: app) của bạn.

Sau đó sử dụng dòng mã này để tải hình ảnh gif của bạn

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

Thêm thông tin về Glide


8

Dựa trên nhận xét của Ahmad Dwaik 'Warlock , tôi đã thử đoạn mã sau và nó đã hoạt động.

  1. Sử dụng một webview trong tệp xml của bạn và điều chỉnh vị trí của nó đến vị trí chính xác mà bạn đang cố gắng hiển thị cho bạn hình ảnh .gif.
  2. Trong hoạt động của bạn, khởi tạo đoạn webview nhỏ này như các khung nhìn khác.
  3. đặt hình ảnh .gif trong thư mục tài sản
  4. bây giờ tải hình ảnh như thể bạn đang tải một url vào webview như "diyaWebView1.loadUrl (" tệp: ///android_asset/www/diya.gif ");"
  5. bạn có thể thấy hình ảnh .gif của mình khi khởi chạy ứng dụng.

PS: điều này hoạt động nếu hình ảnh của bạn phù hợp với webview của bạn hoặc ngược lại nếu hình ảnh lớn hơn so với webview thanh cuộn được kích hoạt và người dùng có thể cuộn hình ảnh web AKA. Vì vậy, chúng ta cần cẩn thận khi sử dụng cái này, để đưa ra kích thước phù hợp cho webview theo hình ảnh hoặc chỉnh sửa hình ảnh phù hợp với webview của bạn.


5

Sử dụng Webview để tải gif như

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

Hãy ghi nhớ tên hình ảnh là trường hợp nhạy cảm. Của tôi kết thúc bằng GIF và nó không hoạt động khi tôi gọiimage.gif
Sam

4

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

}

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

Trong tệp 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);
        }
    }
}

Chúng ta cần sử dụng gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);như khi tăng tốc phần cứng, hình ảnh GIF không hoạt động trên các thiết bị đó. Tăng tốc phần cứng được bật trên các thiết bị ở trên (4.x).


Điều này không cho tôi thấy bất cứ điều gì. Bạn có thể vui lòng chia sẻ nó trên Github?
nhà phát triển Android

4

Như @Ahmad đã nói trong một bình luận , bạn chỉ có thể sử dụng đoạn mã sau để hiển thị ảnh gif!

Chỉ cần bật mã này trong phương thức onCreate và bạn đã sẵn sàng! Ngoài ra, đặt gif của bạn trong assetsthư mục (nếu bạn không có thư mục tài sản, hãy tạo một thư mục bên dưới src/main)

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

3

Chúng ta có thể dễ dàng thêm hình ảnh gif hoạt hình vào chế độ xem hình ảnh bằng thư viện Ion.

Video hướng dẫn :: https://www.youtube.com/watch?v=IqKtpdeIpjA

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

3

Đây là những gì làm việc cho tôi:

Trong build.gradle (dự án) của bạn, hãy viết mavenCentral () trong bản dựng {} và allprojects {}. Nó sẽ giống như thế này:

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

Sau đó, trong build.gradle (mô-đun) thêm phụ thuộc {} đoạn mã này:

biên dịch 'pl.droidsonroids.gif: android-gif-drawable: 1.2.4'

Nó sẽ giống như thế này:

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

Đặt hình ảnh .gif của bạn trong thư mục drawable của bạn. Bây giờ, hãy truy cập ứng dụng> res> layout> Activity_main.xml và thêm đoạn trích này cho .gif của bạn:

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

Và bạn đã hoàn thành :)

Liên kết hữu ích: https://github.com/koral--/android-gif-drawable

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

Hi vọng điêu nay co ich.


2

Bạn có thể hiển thị bất kỳ hình ảnh gif nào qua thư viện Fresco của 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

2

Trước tiên, thêm một phụ thuộc trong module:apptệp build.gradle

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

Sau đó, trong tập tin bố trí

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

1

Gif's cũng có thể được hiển thị trong chế độ xem web với một vài dòng mã và không có bất kỳ thư viện bên thứ 3 nào. Bằng cách này, bạn thậm chí có thể tải gif từ thẻ SD của mình. Không cần phải sao chép hình ảnh vào thư mục Tài sản của bạn.

Hãy xem web.

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

Sử dụng có thể mở tệp gif từ thẻ SD không chỉ từ thư mục tài sản như trong nhiều ví dụ.

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

1

Tôi gặp vấn đề để sử dụng

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

Và tôi cũng không thể tìm thấy tệp jar để thêm vào dự án của mình. Vì vậy, để hiển thị gif, tôi sử dụng WebView như thế này:

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

1

Hiển thị tệp GIF trong Android

Thêm phụ thuộc sau vào tệp build.gradle của bạn.

implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.0'

Trong cách bố trí - activity_xxxxx.xmltập tin thêm GifImageviewnhư dưới đây.

<pl.droidsonroids.gif.GifImageView
   android:id="@+id/CorrWrong"
   android:layout_width="100dp"
  android:layout_height="75dp"/>

Trong tệp Java của bạn, bạn có thể truy cập gif như bên dưới.

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

0
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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.