Menambahkan gambar gif di ImageView di android

135

Saya menambahkan gambar animasi gif di imageView. Saya tidak dapat melihatnya sebagai gambar gif. Tidak ada animasi di sana. Itu muncul hanya sebagai gambar diam. Saya ingin tahu bagaimana cara menampilkannya sebagai gambar gif.

Kamalone
sumber
1
Silakan periksa tautan di bawah ini mungkin bermanfaat bagi Anda stackoverflow.com/questions/3660209/... stackoverflow.com/questions/3691726/…
Nikhil
Gunakan tautan ini yang sederhana / mudah digunakan dan terbaik. http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html
Muhammad Aamir Ali
jika Anda benar-benar ingin menambahkan gambar gif ke dalam tampilan gambar saja, tidak dalam tampilan web daripada menggunakan ini berfungsi dengan baik bagi saya stackoverflow.com/a/29488519/3514144
Ajay Pandya
di sini adalah tautan jawaban untuk pertanyaan Anda stackoverflow.com/questions/35147375/...
Venkatesh Somu

Jawaban:

79

Pertama, salin gambar GIF Anda ke Folder Aset aplikasi Anda, buat kelas berikut dan tempel kode AnimationActivity: -

public class AnimationActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    InputStream stream = null;
    try {
        stream = getAssets().open("piggy.gif");
    } catch (IOException e) {
        e.printStackTrace();
    }
          GifWebView view = new GifWebView(this, "file:///android_asset    /piggy.gif");                 

    setContentView(view);
}
}

GifDecoder: -

public class GifDecoder {

    public static final int STATUS_OK = 0;

    public static final int STATUS_FORMAT_ERROR = 1;

    public static final int STATUS_OPEN_ERROR = 2;

    protected static final int MAX_STACK_SIZE = 4096;
    protected InputStream in;
    protected int status;
    protected int width; // full image width
    protected int height; // full image height
    protected boolean gctFlag; // global color table used
    protected int gctSize; // size of global color table
    protected int loopCount = 1; // iterations; 0 = repeat forever
    protected int[] gct; // global color table
    protected int[] lct; // local color table
    protected int[] act; // active color table
    protected int bgIndex; // background color index
    protected int bgColor; // background color
    protected int lastBgColor; // previous bg color
    protected int pixelAspect; // pixel aspect ratio
    protected boolean lctFlag; // local color table flag
    protected boolean interlace; // interlace flag
    protected int lctSize; // local color table size
    protected int ix, iy, iw, ih; // current image rectangle
    protected int lrx, lry, lrw, lrh;
    protected Bitmap image; // current frame
    protected Bitmap lastBitmap; // previous frame
    protected byte[] block = new byte[256]; // current data block
    protected int blockSize = 0; // block size last graphic control extension info
    protected int dispose = 0; // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
    protected int lastDispose = 0;
    protected boolean transparency = false; // use transparent color
    protected int delay = 0; // delay in milliseconds
    protected int transIndex; // transparent color index
    // LZW decoder working arrays
    protected short[] prefix;
    protected byte[] suffix;
    protected byte[] pixelStack;
    protected byte[] pixels;
    protected Vector<GifFrame> frames; // frames read from current file
    protected int frameCount;

    private static class GifFrame {
            public GifFrame(Bitmap im, int del) {
                    image = im;
                    delay = del;
            }

            public Bitmap image;
            public int delay;
    }


    public int getDelay(int n) {
            delay = -1;
            if ((n >= 0) && (n < frameCount)) {
                    delay = frames.elementAt(n).delay;
            }
            return delay;
    }


    public int getFrameCount() {
            return frameCount;
    }


    public Bitmap getBitmap() {
            return getFrame(0);
    }


    public int getLoopCount() {
            return loopCount;
    }
    protected void setPixels() {

            int[] dest = new int[width * height];

            if (lastDispose > 0) {
                    if (lastDispose == 3) {
                            // use image before last
                            int n = frameCount - 2;
                            if (n > 0) {
                                    lastBitmap = getFrame(n - 1);
                            } else {
                                    lastBitmap = null;
                            }
                    }
                    if (lastBitmap != null) {
                            lastBitmap.getPixels(dest, 0, width, 0, 0, width, height);
                            if (lastDispose == 2) {
                                    // fill last image rect area with background color
                                    int c = 0;
                                    if (!transparency) {
                                            c = lastBgColor;
                                    }
                                    for (int i = 0; i < lrh; i++) {
                                            int n1 = (lry + i) * width + lrx;
                                            int n2 = n1 + lrw;
                                            for (int k = n1; k < n2; k++) {
                                                    dest[k] = c;
                                            }
                                    }
                            }
                    }
            }
            int pass = 1;
            int inc = 8;
            int iline = 0;
            for (int i = 0; i < ih; i++) {
                    int line = i;
                    if (interlace) {
                            if (iline >= ih) {
                                    pass++;
                                    switch (pass) {
                                    case 2:
                                            iline = 4;
                                            break;
                                    case 3:
                                            iline = 2;
                                            inc = 4;
                                            break;
                                    case 4:
                                            iline = 1;
                                            inc = 2;
                                            break;
                                    default:
                                            break;
                                    }
                            }
                            line = iline;
                            iline += inc;
                    }
                    line += iy;
                    if (line < height) {
                            int k = line * width;
                            int dx = k + ix; // start of line in dest
                            int dlim = dx + iw; // end of dest line
                            if ((k + width) < dlim) {
                                    dlim = k + width; // past dest edge
                            }
                            int sx = i * iw; // start of line in source
                            while (dx < dlim) {
                                    // map color and insert in destination
                                    int index = ((int) pixels[sx++]) & 0xff;
                                    int c = act[index];
                                    if (c != 0) {
                                            dest[dx] = c;
                                    }
                                    dx++;
                            }
                    }
            }
            image = Bitmap.createBitmap(dest, width, height, Config.ARGB_4444);
    }
    public Bitmap getFrame(int n) {
            if (frameCount <= 0)
                    return null;
            n = n % frameCount;
            return ((GifFrame) frames.elementAt(n)).image;
    }
    public int read(InputStream is) {
            init();
            if (is != null) {
                    in = is;
                    readHeader();
                    if (!err()) {
                            readContents();
                            if (frameCount < 0) {
                                    status = STATUS_FORMAT_ERROR;
                            }
                    }
            } else {
                    status = STATUS_OPEN_ERROR;
            }
            try {
                    is.close();
            } catch (Exception e) {
            }
            return status;
    }      
    protected void decodeBitmapData() {
            int nullCode = -1;
            int npix = iw * ih;
            int available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, count, i, datum, data_size, first, top, bi, pi;
            if ((pixels == null) || (pixels.length < npix)) {
                    pixels = new byte[npix]; // allocate new pixel array
            }
            if (prefix == null) {
                    prefix = new short[MAX_STACK_SIZE];
            }
            if (suffix == null) {
                    suffix = new byte[MAX_STACK_SIZE];
            }
            if (pixelStack == null) {
                    pixelStack = new byte[MAX_STACK_SIZE + 1];
            }                
            data_size = read();
            clear = 1 << data_size;
            end_of_information = clear + 1;
            available = clear + 2;
            old_code = nullCode;
            code_size = data_size + 1;
            code_mask = (1 << code_size) - 1;
            for (code = 0; code < clear; code++) {
                    prefix[code] = 0; // XXX ArrayIndexOutOfBoundsException
                    suffix[code] = (byte) code;
            }               
            datum = bits = count = first = top = pi = bi = 0;
            for (i = 0; i < npix;) {
                    if (top == 0) {
                            if (bits < code_size) {
                                    // Load bytes until there are enough bits for a code.
                                    if (count == 0) {
                                            // Read a new data block.
                                            count = readBlock();
                                            if (count <= 0) {
                                                    break;
                                            }
                                            bi = 0;
                                    }
                                    datum += (((int) block[bi]) & 0xff) << bits;
                                    bits += 8;
                                    bi++;
                                    count--;
                                    continue;
                            }                               
                            code = datum & code_mask;
                            datum >>= code_size;
                            bits -= code_size;                               
                            if ((code > available) || (code == end_of_information)) {
                                    break;
                            }
                            if (code == clear) {
                                    // Reset decoder.
                                    code_size = data_size + 1;
                                    code_mask = (1 << code_size) - 1;
                                    available = clear + 2;
                                    old_code = nullCode;
                                    continue;
                            }
                            if (old_code == nullCode) {
                                    pixelStack[top++] = suffix[code];
                                    old_code = code;
                                    first = code;
                                    continue;
                            }
                            in_code = code;
                            if (code == available) {
                                    pixelStack[top++] = (byte) first;
                                    code = old_code;
                            }
                            while (code > clear) {
                                    pixelStack[top++] = suffix[code];
                                    code = prefix[code];
                            }
                            first = ((int) suffix[code]) & 0xff;
                            if (available >= MAX_STACK_SIZE) {
                                    break;
                            }
                            pixelStack[top++] = (byte) first;
                            prefix[available] = (short) old_code;
                            suffix[available] = (byte) first;
                            available++;
                            if (((available & code_mask) == 0) && (available < MAX_STACK_SIZE)) {
                                    code_size++;
                                    code_mask += available;
                            }
                            old_code = in_code;
                    }
                    // Pop a pixel off the pixel stack.
                    top--;
                    pixels[pi++] = pixelStack[top];
                    i++;
            }
            for (i = pi; i < npix; i++) {
                    pixels[i] = 0; // clear missing pixels
            }
    }        
    protected boolean err() {
            return status != STATUS_OK;
    }       
    protected void init() {
            status = STATUS_OK;
            frameCount = 0;
            frames = new Vector<GifFrame>();
            gct = null;
            lct = null;
    }        
    protected int read() {
            int curByte = 0;
            try {
                    curByte = in.read();
            } catch (Exception e) {
                    status = STATUS_FORMAT_ERROR;
            }
            return curByte;
    }       
    protected int readBlock() {
            blockSize = read();
            int n = 0;
            if (blockSize > 0) {
                    try {
                            int count = 0;
                            while (n < blockSize) {
                                    count = in.read(block, n, blockSize - n);
                                    if (count == -1) {
                                            break;
                                    }
                                    n += count;
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
                    if (n < blockSize) {
                            status = STATUS_FORMAT_ERROR;
                    }
            }
            return n;
    }        
    protected int[] readColorTable(int ncolors) {
            int nbytes = 3 * ncolors;
            int[] tab = null;
            byte[] c = new byte[nbytes];
            int n = 0;
            try {
                    n = in.read(c);
            } catch (Exception e) {
                    e.printStackTrace();
            }
            if (n < nbytes) {
                    status = STATUS_FORMAT_ERROR;
            } else {
                    tab = new int[256]; // max size to avoid bounds checks
                    int i = 0;
                    int j = 0;
                    while (i < ncolors) {
                            int r = ((int) c[j++]) & 0xff;
                            int g = ((int) c[j++]) & 0xff;
                            int b = ((int) c[j++]) & 0xff;
                            tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b;
                    }
            }
            return tab;
    }       
    protected void readContents() {
            // read GIF file content blocks
            boolean done = false;
            while (!(done || err())) {
                    int code = read();
                    switch (code) {
                    case 0x2C: // image separator
                            readBitmap();
                            break;
                    case 0x21: // extension
                            code = read();
                            switch (code) {
                            case 0xf9: // graphics control extension
                                    readGraphicControlExt();
                                    break;
                            case 0xff: // application extension
                                    readBlock();
                                    String app = "";
                                    for (int i = 0; i < 11; i++) {
                                            app += (char) block[i];
                                    }
                                    if (app.equals("NETSCAPE2.0")) {
                                            readNetscapeExt();
                                    } else {
                                            skip(); // don't care
                                    }
                                    break;
                            case 0xfe:// comment extension
                                    skip();
                                    break;
                            case 0x01:// plain text extension
                                    skip();
                                    break;
                            default: // uninteresting extension
                                    skip();
                            }
                            break;
                    case 0x3b: // terminator
                            done = true;
                            break;
                    case 0x00: // bad byte, but keep going and see what happens break;
                    default:
                            status = STATUS_FORMAT_ERROR;
                    }
            }
    }      
    protected void readGraphicControlExt() {
            read(); // block size
            int packed = read(); // packed fields
            dispose = (packed & 0x1c) >> 2; // disposal method
            if (dispose == 0) {
                    dispose = 1; // elect to keep old image if discretionary
            }
            transparency = (packed & 1) != 0;
            delay = readShort() * 10; // delay in milliseconds
            transIndex = read(); // transparent color index
            read(); // block terminator
    }       
    protected void readHeader() {
            String id = "";
            for (int i = 0; i < 6; i++) {
                    id += (char) read();
            }
            if (!id.startsWith("GIF")) {
                    status = STATUS_FORMAT_ERROR;
                    return;
            }
            readLSD();
            if (gctFlag && !err()) {
                    gct = readColorTable(gctSize);
                    bgColor = gct[bgIndex];
            }
    }        
    protected void readBitmap() {
            ix = readShort(); // (sub)image position & size
            iy = readShort();
            iw = readShort();
            ih = readShort();
            int packed = read();
            lctFlag = (packed & 0x80) != 0; // 1 - local color table flag interlace
            lctSize = (int) Math.pow(2, (packed & 0x07) + 1);
            interlace = (packed & 0x40) != 0;
            if (lctFlag) {
                    lct = readColorTable(lctSize); // read table
                    act = lct; // make local table active
            } else {
                    act = gct; // make global table active
                    if (bgIndex == transIndex) {
                            bgColor = 0;
                    }
            }
            int save = 0;
            if (transparency) {
                    save = act[transIndex];
                    act[transIndex] = 0; // set transparent color if specified
            }
            if (act == null) {
                    status = STATUS_FORMAT_ERROR; // no color table defined
            }
            if (err()) {
                    return;
            }
            decodeBitmapData(); // decode pixel data
            skip();
            if (err()) {
                    return;
            }
            frameCount++;
            // create new image to receive frame data
            image = Bitmap.createBitmap(width, height, Config.ARGB_4444);
            setPixels(); // transfer pixel data to image
            frames.addElement(new GifFrame(image, delay)); // add image to frame
            // list
            if (transparency) {
                    act[transIndex] = save;
            }
            resetFrame();
    }
    protected void readLSD() {
            // logical screen size
            width = readShort();
            height = readShort();
            // packed fields
            int packed = read();
            gctFlag = (packed & 0x80) != 0; // 1 : global color table flag
            // 2-4 : color resolution
            // 5 : gct sort flag
            gctSize = 2 << (packed & 7); // 6-8 : gct size
            bgIndex = read(); // background color index
            pixelAspect = read(); // pixel aspect ratio
    }       
    protected void readNetscapeExt() {
            do {
                    readBlock();
                    if (block[0] == 1) {
                            // loop count sub-block
                            int b1 = ((int) block[1]) & 0xff;
                            int b2 = ((int) block[2]) & 0xff;
                            loopCount = (b2 << 8) | b1;
                    }
            } while ((blockSize > 0) && !err());
    }       
    protected int readShort() {
            // read 16-bit value, LSB first
            return read() | (read() << 8);
    }
    protected void resetFrame() {
            lastDispose = dispose;
            lrx = ix;
            lry = iy;
            lrw = iw;
            lrh = ih;
            lastBitmap = image;
            lastBgColor = bgColor;
            dispose = 0;
            transparency = false;
            delay = 0;
            lct = null;
    }
    protected void skip() {
            do {
                    readBlock();
            } while ((blockSize > 0) && !err());
    }
}

GifDecoderView: -

public class GifDecoderView extends ImageView {

private boolean mIsPlayingGif = false;

private GifDecoder mGifDecoder;

private Bitmap mTmpBitmap;

final Handler mHandler = new Handler();

final Runnable mUpdateResults = new Runnable() {
    public void run() {
        if (mTmpBitmap != null && !mTmpBitmap.isRecycled()) {
            GifDecoderView.this.setImageBitmap(mTmpBitmap);
        }
    }
};

public GifDecoderView(Context context, InputStream stream) {
    super(context);
    playGif(stream);
}

private void playGif(InputStream stream) {
    mGifDecoder = new GifDecoder();
    mGifDecoder.read(stream);

    mIsPlayingGif = true;

    new Thread(new Runnable() {
        public void run() {
            final int n = mGifDecoder.getFrameCount();
            final int ntimes = mGifDecoder.getLoopCount();
            int repetitionCounter = 0;
            do {
                for (int i = 0; i < n; i++) {
                    mTmpBitmap = mGifDecoder.getFrame(i);
                    int t = mGifDecoder.getDelay(i);
                    mHandler.post(mUpdateResults);
                    try {
                        Thread.sleep(t);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if(ntimes != 0) {
                    repetitionCounter ++;
                }
            } while (mIsPlayingGif && (repetitionCounter <= ntimes));
        }
    }).start();
}

public void stopRendering() {
    mIsPlayingGif = true;
}
}

GifMovieView: -

public class GifMovieView extends View {

private Movie mMovie;

private long mMoviestart;

public GifMovieView(Context context, InputStream stream) {
    super(context);

    mMovie = Movie.decodeStream(stream);        
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.TRANSPARENT);
    super.onDraw(canvas);
    final long now = SystemClock.uptimeMillis();

    if (mMoviestart == 0) { 
        mMoviestart = now;
    }

    final int relTime = (int)((now - mMoviestart) % mMovie.duration());
    mMovie.setTime(relTime);
    mMovie.draw(canvas, 10, 10);
    this.invalidate();
}
}

GifWebView: -

public class GifWebView extends WebView {

public GifWebView(Context context, String path) {
    super(context);        

    loadUrl(path);
}
}

I Think It Might Help You ... :)

Yash
sumber
72
pada dasarnya Anda tidak memerlukan semua itu karena Anda membuat decoder dan kode comlex dan tidak pernah menggunakannya! Anda menggunakan tampilan GifWebView = GifWebView baru (ini, "file: /// android_asset /piggy.gif"); yang memanggil subkelas dari tampilan web yang tidak memiliki penyesuaian untuk tampilan web, Anda dapat mengganti seluruh kode ini dengan 3 baris .. webView wView = new webView (this); wView.loadUrl ("file: ///android_asset/piggy.gif"); setContentView (tampilan);
Ahmad Dwaik 'Warlock'
2
Hai terima kasih atas jawaban Anda .. :) ini bekerja dengan baik !! tapi saya punya satu masalah dengan tampilan web (di kelas GifWebView) yang menampilkan file gif lebih besar dari layar perangkat. jadi bagaimana memberikan lebar dan tinggi khusus untuk tampilan itu ATAU saya bisa menggunakan tampilan lain ???
Pelajar Android
Ini hanya akan memainkan gif saya sekali? Itu tidak akan terus bersepeda melalui gif ??? Adakah di sana saya dapat menjalankan kembali metode untuk menampilkannya lagi?
James111
tolong bantu saya dengan ini: stackoverflow.com/questions/32996878/…
Khuong
Ini berfungsi untuk perangkat saya yang berjalan pada 4.4, tetapi ketika saya menjalankannya pada perangkat Lollipop (5.1), Gif tidak menghidupkan.
vikzilla
217

Di build.gradle Anda (Modul: aplikasi), tambahkan android-gif-drawablesebagai dependensi dengan menambahkan kode berikut:

allprojects {
    repositories {
       mavenCentral()
    }
}

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


UPDATE : Pada Android Gradle Plugin 3.0.0 , perintah baru untuk kompilasi adalah implementation, jadi baris di atas mungkin harus diubah menjadi:

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

Kemudian sinkronkan proyek Anda. Ketika sinkronisasi berakhir, buka file tata letak Anda dan tambahkan kode berikut:

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

Dan hanya itu, Anda dapat mengelolanya dengan ImageView sederhana.

Armando Esparza García
sumber
9
Jawaban ini adalah jawaban terbaik dan bekerja sangat lancar untuk saya, saya mencoba hal yang berbeda dan membangun kelas dan sulit dipercaya setelah saya menemukan ini .... Terima kasih tuan;)
Alexiscanny
halus, lebih baik daripada meluncur untuk gif
Himanshu Shekher Jha
1
Juga yang terbaik untuk saya, diimplementasikan dalam 10 detik
Diogo Garcia
langkah sederhana. ini seharusnya jawabannya. dilakukan dalam hitungan menit
sunil
3
Bukankah pl.droidsonroids.gif.GifImageViewseharusnya digunakan?
Flimm
23

Gunakan VideoView.

Secara alami, ImageView tidak mendukung gambar animasi. Anda memiliki dua opsi untuk menampilkan file gif animasi

  1. Menggunakan VideoView
  2. Gunakan ImageViewdan Pisahkan file gif menjadi beberapa bagian dan kemudian terapkan animasi padanya
Sunil Kumar Sahoo
sumber
8
Bagaimana saya bisa menggunakan VideoView. Bisakah saya menunjukkan gambar gif tertentu dalam VideoView
Kamalone
Bagaimana Anda bisa menggunakan VideoView? Jika saya mengatur jalur ke Gif itu tidak akan berhasil.
entropid
Saya juga tidak mengerti bagaimana VideoViewbisa digunakan untuk menampilkan animasi GIF?
Ajay S
Lupakan gif dan gunakan video untuk animasi. Saya kira begitulah caranya. Tidak yakin itu adalah jawaban untuk pertanyaan itu.
Krishnabhadra
@Sunil Kumar Sahoo Anda tidak menjawab komentar pengguna mana pun!
user25
16

dengan perpustakaan Glide terbaru

gunakan Gradle:

repositories {
  mavenCentral()
  google()
}

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

dalam aktivitas atau fragmen:

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);
shellhub
sumber
12

Menampilkan GIF di Android

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

        }

 }

 }

Sekarang panggil kelas ini dalam XML Anda

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

NP

Ubah AndroidManifest.xml untuk mematikan perangkat keras yang dipercepat.

 android:hardwareAccelerated="false"

Referensi

Trik Lain

Untuk fungsi animasi, Anda dapat mengunjungi

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

IntelliJ Amiya
sumber
1
Bekerja dengan baik! Apakah Anda tahu level API minimum untuk mengimplementasikan ini?
Khan
@KhanSquare Mungkin 15
IntelliJ Amiya
@ Lakhan Di sini berfungsi dengan baik. Oke, saya akan memeriksanya lagi
IntelliJ Amiya
1
sesuai jawaban kimmi dhingra di bawah ini yang saya berikan jika (Build.VERSION.SDK_INT> = 11) {gifImageView.setLayerType (View.LAYER_TYPE_SOFTWARE, null); }
Aditya Vyas-Lakhan
1
@IntelliJAmiya ya itu akan membantu orang lain juga
Aditya Vyas-Lakhan
10

Saya akan menyarankan Anda untuk menggunakan perpustakaan Glide. Untuk menggunakan Glide, Anda perlu menambahkan ini untuk menambahkan dependensi ini

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

ke file grandle (Module: app) Anda.

Kemudian gunakan baris kode ini untuk memuat gambar gif Anda

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

Informasi Lebih Lanjut tentang Glide

Karue Benson Karue
sumber
8

Berdasarkan komentar Warlock Ahmad Dwaik , saya telah mencoba kode berikut dan berhasil.

  1. Gunakan tampilan web di file xml Anda, dan sesuaikan posisinya dengan tempat di mana Anda sebenarnya berusaha menampilkan gambar .gif.
  2. Dalam aktivitas Anda inisialisasikan potongan kecil tampilan web ini seperti tampilan lainnya.
  3. tempatkan gambar .gif di folder aset
  4. sekarang memuat gambar seolah-olah Anda memuat url ke tampilan web seperti "diyaWebView1.loadUrl (" file: ///android_asset/www/diya.gif ");"
  5. Anda dapat melihat gambar .gif Anda saat meluncurkan aplikasi.

PS: ini berfungsi jika gambar .gif Anda cocok dengan tampilan web atau sebaliknya, jika gambar lebih besar dari tampilan web bilah gulir diaktifkan dan pengguna dapat menggulir gambar tampilan web AKA. Jadi kita harus berhati-hati ketika menggunakan ini, untuk memberikan ukuran yang tepat untuk tampilan web sesuai gambar atau mengedit gambar yang sesuai dengan tampilan web Anda.

Sid
sumber
5

Gunakan Webview untuk memuat gif seperti

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");
Fuad Saneen
sumber
Ingat nama gambar peka huruf besar-kecil. Milik saya berakhir dengan GIF dan tidak berfungsi ketika saya meneleponimage.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();
        }
    }

}

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

Dalam Java File

public class MainActivity extends Activity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        GifImageView gifImageView = (GifImageView) findViewById(R.id.gifImageView1);
        if (Build.VERSION.SDK_INT >= 11) {
            gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }
}

Kita perlu menggunakan gifImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);ketika perangkat keras dipercepat diaktifkan, gambar GIF tidak berfungsi pada perangkat itu. Akselerasi perangkat keras diaktifkan pada perangkat di atas (4.x).

Kimmi Dhingra
sumber
Ini tidak menunjukkan apa-apa padaku. Bisakah Anda membagikannya di Github?
pengembang android
4

Seperti @Ahmad katakan dalam komentar , Anda bisa menggunakan kode berikut untuk menampilkan gif!

Cukup popup kode ini dalam metode onCreate dan Anda siap melakukannya! Juga, tempatkan gif Anda di dalam assetsfolder (jika Anda tidak memiliki folder aset, buat di bawah src/main)

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

Kita dapat dengan mudah menambahkan gambar gif animasi pada tampilan gambar menggunakan perpustakaan Ion.

Video tutorial :: https://www.youtube.com/watch?v=IqKtpdeIpjA

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

Inilah yang bekerja untuk saya:

Di build.gradle (proyek) Anda, tulis mavenCentral () di buildscript {} dan allprojects {}. Seharusnya terlihat seperti ini:

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

Lalu, di build.gradle (module) tambahkan dependensi {} snippet ini:

kompilasi 'pl.droidsonroids.gif: android-gif-drawable: 1.2.4'

seharusnya terlihat seperti ini:

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

Masukkan gambar .gif Anda di folder yang dapat digambar. Sekarang buka aplikasi> res> tata letak> activity_main.xml dan tambahkan potongan ini untuk .gif Anda:

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

Dan Anda selesai :)

Tautan yang bermanfaat: https://github.com/koral--/android-gif-drawable

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

Semoga ini membantu.

JediCate
sumber
2

Anda dapat menampilkan gambar gif apa pun melalui perpustakaan Fresco oleh 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
mohax
sumber
2

Pertama tambahkan dependensi dalam module:appfile build.gradle

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

Lalu, di file layout

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

Gif juga dapat ditampilkan dalam tampilan web dengan beberapa baris kode dan tanpa pustaka pihak ke-3. Dengan cara ini Anda bahkan dapat memuat gif dari kartu SD Anda. Tidak perlu menyalin gambar ke folder Aset Anda.

Ambil tampilan web.

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

Penggunaan dapat membuka file gif dari kartu SD tidak hanya dari folder aset seperti yang ditunjukkan dalam banyak contoh.

    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);
Prakash
sumber
1

Saya menghadapi masalah untuk digunakan

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

Dan juga saya tidak dapat menemukan file jar untuk ditambahkan ke proyek saya. Jadi, untuk menampilkan gif, saya menggunakan WebView seperti ini:

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);
Ramin Pakzadmanesh
sumber
1

Tampilkan file GIF di android

Tambahkan dependensi berikut di file build.gradle Anda.

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

Dalam tata letak - activity_xxxxx.xmlfile tambahkan GifImageviewseperti di bawah ini.

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

Dalam file Java Anda, Anda dapat mengakses gif seperti di bawah ini.

 GifImageView emoji;
 emoji = (GifImageView)findViewById(R.id.CorrWrong);
sbchitra
sumber
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();
atiq mumtaz
sumber