Android में एक ImageView में gif छवि को जोड़ना


135

मैंने एक छवि दृश्य में एक एनिमेटेड GIF छवि जोड़ी। मैं इसे जीआईएफ इमेज के रूप में नहीं देख पा रहा हूं। कोई एनीमेशन नहीं है। यह अभी भी एक छवि के रूप में दिखाई दे रहा है। मैं जानना चाहूंगा कि मैं इसे gif छवि के रूप में कैसे दिखा सकता हूं।


1
कृपया नीचे दिए गए लिंक की जाँच करें जो आपके लिए उपयोगी हो सकता है stackoverflow.com/questions/3660209/… stackoverflow.com/questions/3691726/…
निखिल

इस लिंक का उपयोग इसके सरल / उपयोग में आसान और सर्वोत्तम है। http://abhinavasblog.blogspot.com/2014/04/animated-gif-imageview-library-for.html
मुहम्मद आमिर अली

यदि आप वास्तव में छवि में केवल gif छवि जोड़ना चाहते हैं, तो webview में नहीं है, इसके लिए मेरे ठीक काम का उपयोग करें stackoverflow.com/a/29488519/3514144
अजय पंड्या

यहाँ आपके सवाल का जवाब लिंक है stackoverflow.com/questions/35147375/…
वेंकटेश सोमू

जवाबों:


79

सबसे पहले, अपने GIF इमेज को अपने ऐप के एसेट फोल्डर में कॉपी करें, निम्न कक्षाएं बनाएं और कोड ऐनिमेशन को पेस्ट करें : -

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

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

    setContentView(view);
}
}

GifDecoder: -

public class GifDecoder {

    public static final int STATUS_OK = 0;

    public static final int STATUS_FORMAT_ERROR = 1;

    public static final int STATUS_OPEN_ERROR = 2;

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

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

            public Bitmap image;
            public int delay;
    }


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


    public int getFrameCount() {
            return frameCount;
    }


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


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

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

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

GifDecoderView: -

public class GifDecoderView extends ImageView {

private boolean mIsPlayingGif = false;

private GifDecoder mGifDecoder;

private Bitmap mTmpBitmap;

final Handler mHandler = new Handler();

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

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

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

    mIsPlayingGif = true;

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

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

GifMovieView: -

public class GifMovieView extends View {

private Movie mMovie;

private long mMoviestart;

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

    mMovie = Movie.decodeStream(stream);        
}

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

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

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

GifWebView: -

public class GifWebView extends WebView {

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

    loadUrl(path);
}
}

मुझे लगता है कि यह आपकी मदद कर सकता है ... :)


72
मूल रूप से आपको डिकोडर्स और कॉम्प्लेक्स कोड बनाने के बाद से सभी की आवश्यकता नहीं है और इसका उपयोग कभी न करें! आप GifWebView दृश्य = नए GifWebView का उपयोग कर रहे हैं (यह, "फ़ाइल: /// android_asset /piggy.gif"); जो वेबव्यू का उपवर्ग कहता है जिसका वेबव्यू के लिए कोई अनुकूलन नहीं है, आप इस पूरे कोड को 3 लाइनों के साथ बदल सकते हैं .. webView wView = new webView (यह); wView.loadUrl ( "फ़ाइल: ///android_asset/piggy.gif"); setContentView (देखें);
अहमद द्विक 'वॉरलॉक'

2
अरे आपके उत्तर के लिए धन्यवाद .. :) इसका काम अच्छा है !! लेकिन मेरे पास वेबव्यू (GifWebView वर्ग में) का एक मुद्दा है, जो कि डिवाइस स्क्रीन से बड़ी gif फाइल को प्रदर्शित करता है। तो उस दृश्य के लिए कस्टम चौड़ाई और ऊंचाई कैसे प्रदान करें अन्यथा मैं किसी अन्य दृश्य का उपयोग कर सकता हूं ???
Android शिक्षार्थी

यह केवल एक बार मेरे जिफ खेलेंगे? यह gif के माध्यम से साइकिल नहीं रखेंगे ??? वैसे भी क्या मैं इसे फिर से प्रदर्शित करने के तरीकों को फिर से चला सकता हूं?
जेम्स ११

कृपया इसके साथ मेरी मदद करें: stackoverflow.com/questions/32996878/…
खूंग

यह 4.4 पर चलने वाले मेरे डिवाइस के लिए काम करता है, लेकिन जब मैंने इसे लॉलीपॉप डिवाइस (5.1) पर चलाया तो Gif चेतन नहीं करता है।
vikzilla

217

अपने build.gradle (मॉड्यूल: एप्लिकेशन) में, android-gif-drawableनिम्न कोड जोड़कर निर्भरता के रूप में जोड़ें :

allprojects {
    repositories {
       mavenCentral()
    }
}

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


अद्यतन : एंड्रॉइड ग्रैडल प्लगिन 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 के साथ प्रबंधित कर सकते हैं।


9
यह उत्तर सबसे अच्छा उत्तर है और यह मेरे लिए बहुत आसान काम करता है, मैंने अलग-अलग चीज़ों की कोशिश की और कक्षाएं और अविश्वसनीय बनाने के बाद मैंने यह पाया .... धन्यवाद मिस्टर;)
एलेक्सीसन

चिकनी, बेहतर तो जिफ़ के लिए ग्लाइड
हिमांशु शेखर झा

1
मेरे लिए भी सबसे अच्छा, 10 सेकंड में लागू किया गया
डियागो गार्सिया

सरल कदम। इसका उत्तर होना चाहिए। मिनटों में किया
सुनील

3
pl.droidsonroids.gif.GifImageViewइसके बजाय इस्तेमाल नहीं किया जाना चाहिए ?
फ्लिम

23

VideoView का उपयोग करें

Natively ImageView एनिमेटेड छवि का समर्थन नहीं करता है। एनिमेटेड जिफ़ फ़ाइल दिखाने के लिए आपके पास दो विकल्प हैं

  1. उपयोग VideoView
  2. ImageViewजिफ़ फ़ाइल को कई भागों में उपयोग और विभाजित करें और फिर उस पर एनीमेशन लागू करें

8
मैं VideoView का उपयोग कैसे कर सकता हूं। क्या मैं उस वीडियो व्यू
कमलोन

आप VideoView का उपयोग कैसे कर सकते हैं? अगर मैं एक जीआईएफ के लिए रास्ता तय करूं तो यह काम नहीं करेगा।
एंट्रोपिड

मुझे यह भी नहीं मिला कि VideoViewएनिमेटेड GIF को प्रदर्शित करने के लिए कैसे उपयोग किया जा सकता है?
अजय एस

जिफ़ को भूल जाओ और एनीमेशन के लिए एक वीडियो का उपयोग करें। मुझे लगता है कि यह कैसे है। हालांकि यह सवाल का जवाब नहीं है।
कृष्णभद्र

@ सुनील कुमार साहू आपने किसी भी उपयोगकर्ता की टिप्पणी का जवाब नहीं दिया!
user25

16

नवीनतम ग्लाइड लाइब्रेरी के साथ

ग्रेडेल का उपयोग करें:

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

12

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


1
अच्छा काम कर रहे हैं! क्या आप इसे लागू करने के लिए न्यूनतम एपीआई स्तर जानते हैं?
खान

@KhanSquare शायद 15
इंटेलीजे अमिय

@ लखन यहाँ में ठीक काम करता है। फिर मैं इसे फिर से जाँचूँगा
IntelliJ Amiya

1
निम्नांकित के अनुसार किम्मी ढींगरा के उत्तर के अनुसार यदि (Build.VERSION.SDK_INT> = 11) {gifImageView.setLayerType (View.LAYER_TYPE_SOFTWARE, null) देखें; }
आदित्य व्यास-लखन

1
@IntelliJAmiya हाँ, जो दूसरों की भी मदद करेगा
आदित्य व्यास-लखन

10

मैं आपको ग्लाइड लाइब्रेरी का उपयोग करने का सुझाव दूंगा। ग्लाइड का उपयोग करने के लिए आपको इन निर्भरताओं को जोड़ने के लिए इसे जोड़ने की आवश्यकता है

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

ग्लाइड पर अधिक जानकारी


8

अहमद द्विक की वॉरलॉक की टिप्पणी के आधार पर , मैंने निम्नलिखित कोड की कोशिश की है और इसने काम किया है।

  1. अपने xml फ़ाइल में एक वेबव्यू का उपयोग करें, और उसकी स्थिति को उस स्थान पर समायोजित करें जहां आप वास्तव में आपको .gif छवि दिखाने की कोशिश कर रहे थे।
  2. अपनी गतिविधि में वेबव्यू के इस छोटे टुकड़े को अन्य दृश्यों की तरह इनिशियलाइज़ करें।
  3. .gif छवि को संपत्ति फ़ोल्डर में रखें
  4. अब छवि को इस तरह से लोड करें जैसे आप "diyaWebView1.loadUrl (" फ़ाइल: ///android_asset/www/diya.gif ") जैसे वेबलॉग में एक url लोड कर रहे हैं;"
  5. जब आप एप्लिकेशन लॉन्च करते हैं तो आप अपनी .gif छवि देख सकते हैं।

PS: यह चीजें तब काम करती हैं जब आप .gif इमेज आपके वेबव्यू या वाइसवेरेस को फिट करते हैं या यदि इमेज वेबबार से बड़ी हो तो स्क्रॉलबार सक्षम हो जाता है और उपयोगकर्ता इमेज AKA वेबव्यू स्क्रॉल कर सकता है। इसलिए जब हम इसका उपयोग करते हैं, तो हमें सावधानी बरतने की आवश्यकता होती है ताकि छवि के अनुसार वेबव्यू को उचित आकार दिया जा सके या आपके वेबव्यू को फिट करने वाली छवि को संपादित किया जा सके।


5

जैसे जिफ़ को लोड करने के लिए वेबव्यू का उपयोग करें

webView = (WebView) findViewById(R.id.webView);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/1.gif");

ध्यान रखें छवि का नाम केस संवेदी है। मेरा GIF के साथ समाप्त होता है और जब मैंने फोन किया तो यह काम नहीं कियाimage.gif
सैम

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

}

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>

जावा फ़ाइल में

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 छवि उन डिवाइस पर काम नहीं करती है। त्वरित (4x) से ऊपर के उपकरणों पर हार्डवेयर सक्षम है।


यह मुझे कुछ भी नहीं दिखाता है। क्या आप इसे गीथूब पर साझा कर सकते हैं?
एंड्रॉइड डेवलपर

4

जैसा कि @ अहमद ने एक टिप्पणी में कहा , आप केवल निम्नलिखित कोड का उपयोग कर सकते हैं एक gif प्रदर्शित करने के लिए!

बस onCreate विधि में इस कोड को पॉप करें और आप जाने के लिए अच्छे हैं! इसके अलावा, अपने जीआईएफ को assetsफ़ोल्डर के अंदर रखें (यदि आपके पास संपत्ति फ़ोल्डर नहीं है, तो एक निर्माण करें src/main)

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

3

हम आसानी से आयन लाइब्रेरी का उपयोग करके इमेजव्यू पर एनिमेटेड जिफ इमेज जोड़ सकते हैं।

ट्यूटोरियल वीडियो :: https://www.youtube.com/watch?v=IqKtpdeIpjA

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

3

इसी से मेरा काम बना है:

अपने build.gradle (प्रोजेक्ट) में बिल्डवर्ड {} और allprojects {} में mavenCentral () लिखें। इसे ऐसा दिखना चाहिए:

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

फिर, build.gradle (मॉड्यूल) पर निर्भरता में जोड़ें {} यह स्निपेट:

संकलन 'pl.droidsonroids.gif: android-gif-drawable: 1.2.4'

इसे ऐसा दिखना चाहिए:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'
    **compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.4'**
}

अपनी .gif छवि को अपने आकर्षित करने योग्य फ़ोल्डर में रखें। अब ऐप> res> लेआउट> 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

उम्मीद है की यह मदद करेगा।


2

आप फेसबुक द्वारा लाइब्रेरी फ्रेस्को के माध्यम से किसी भी 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

2

सबसे पहले module:appbuild.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"
        />

1

Gif को कोड की कुछ पंक्तियों के साथ और बिना किसी तीसरे पक्ष के पुस्तकालयों के वेब दृश्य में भी प्रदर्शित किया जा सकता है। इस तरह से आप अपने एसडी कार्ड से भी जिफ़ लोड कर सकते हैं। अपने एसेट फ़ोल्डर में छवियों को कॉपी करने की आवश्यकता नहीं है।

वेब दृश्य लें।

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

उपयोग एसडी कार्ड से एक 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);

1

मुझे इस्तेमाल करने में समस्या का सामना करना पड़ा

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

और यह भी कि मैं अपने प्रोजेक्ट में जोड़ने के लिए जार फ़ाइल नहीं ढूँढ सका। तो, 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);

1

Android में GIF फ़ाइल प्रदर्शित करें

अपनी build.gradle फ़ाइल में निम्न निर्भरता जोड़ें।

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

लेआउट में - activity_xxxxx.xmlफ़ाइल GifImageviewनीचे के रूप में जोड़ें ।

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

आपकी जावा फ़ाइल में, यू नीचे gif को एक्सेस कर सकता है।

 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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.