android– 如何在imageview中显示.gif文件?

android– 如何在imageview中显示.gif文件?,第1张

概述我的布局有很多图像视图.我想在一个imageview中显示.gif动画文件.我尝试了Yash方法(AddinggifimageinanImageViewinandroid),但.gif文件显示了所有布局.其他观点消失了.我要展示所有.任何想法?解决方法:将.gif文件放入res/raw文件夹,片段或活动中,然后在imageview中设置g

我的布局有很多图像视图.我想在一个imagevIEw中显示.gif动画文件.我尝试了Yash方法(Adding gif image in an ImageView in android),但.gif文件显示了所有布局.其他观点消失了.

我要展示所有.

任何想法?

解决方法:

将.gif文件放入res / raw文件夹,片段或活动中,然后在imagevIEw中设置gif

GifAnimationDrawable gif;    try {            gif = new              GifAnimationDrawable(getResources().openRawResource(R.raw.download));            gif.setoneshot(false);        } catch (NotFoundException e) {            e.printstacktrace();        } catch (IOException e) {            e.printstacktrace();        }        ivGif.setimageDrawable(gif);        gif.setVisible(true, true);    }

1)GifAnimationDrawable .java

public class GifAnimationDrawable extends AnimationDrawable    {        private boolean decoded;    private GifDecoder mGifDecoder;    private Bitmap mTmpBitmap;    private int height, wIDth;    public GifAnimationDrawable(file f) throws IOException    {        this(f, false);    }    public GifAnimationDrawable(inputStream is) throws IOException    {        this(is, false);    }    public GifAnimationDrawable(file f, boolean inline) throws IOException    {        this(new BufferedinputStream(new fileinputStream(f), 32768), inline);    }    public GifAnimationDrawable(inputStream is, boolean inline) throws IOException    {        super();        inputStream bis = is;        if(!BufferedinputStream.class.isinstance(bis)) bis = new BufferedinputStream(is, 32768);        decoded = false;        mGifDecoder = new GifDecoder();        mGifDecoder.read(bis);        mTmpBitmap = mGifDecoder.getFrame(0);        androID.util.Log.v("GifAnimationDrawable", "===>Lead frame: ["+wIDth+"x"+height+"; "+mGifDecoder.getDelay(0)+";"+mGifDecoder.getLoopCount()+"]");        height = mTmpBitmap.getHeight();        wIDth = mTmpBitmap.getWIDth();        addFrame(new BitmapDrawable(mTmpBitmap), mGifDecoder.getDelay(0));        setoneshot(mGifDecoder.getLoopCount() != 0);        setVisible(true, true);        if(inline){            loader.run();        }else{            new Thread(loader).start();        }    }    public boolean isDecoded(){ return decoded; }    private Runnable loader = new Runnable(){        public voID run()         {            mGifDecoder.complete();            int i, n = mGifDecoder.getFrameCount(), t;            for(i=1;i<n;i++){                mTmpBitmap = mGifDecoder.getFrame(i);                t = mGifDecoder.getDelay(i);                androID.util.Log.v("GifAnimationDrawable", "===>Frame "+i+": "+t+"]");                addFrame(new BitmapDrawable(mTmpBitmap), t);            }            decoded = true;            mGifDecoder = null;        }    };    public int getMinimumHeight(){ return height; }    public int getMinimumWIDth(){ return wIDth; }    public int getIntrinsicHeight(){ return height; }    public int getIntrinsicWIDth(){ return wIDth; }}

2)GifDecoder.java

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;    public static final    int MIN_DELAY                   = 100;    public static final    int MIN_DELAY_ENFORCE_THRESHolD = 20;    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 boolean readComplete;    public GifDecoder()    {        readComplete = false;    }    private static class GifFrame {        public GifFrame(Bitmap im, int del) {            image = im;            delay = del;        }        public Bitmap image;        public int delay;    }    /**     * Gets display duration for specifIEd frame.     *     * @param n     *          int index of frame     * @return delay in milliseconds     */    public int getDelay(int n) {        delay = -1;        if ((n >= 0) && (n < frameCount)) {            delay = frames.elementAt(n).delay;            //meets browser compatibility standards            if (delay < MIN_DELAY_ENFORCE_THRESHolD) delay = MIN_DELAY;        }        return delay;    }    /**     * Gets the number of frames read from file.     *     * @return frame count     */    public int getFrameCount() {        return frameCount;    }    /**     * Gets the first (or only) image read.     *     * @return BufferedBitmap containing first frame, or null if none.     */    public Bitmap getBitmap() {        return getFrame(0);    }    /**     * Gets the "netscape" iteration count, if any. A count of 0 means repeat indefinitIEly.     *     * @return iteration count if one was specifIEd, else 1.     */    public int getLoopCount() {        return loopCount;    }    /**     * Creates new frame image from current data (and prevIoUs frames as specifIEd by their disposition codes).     */    protected voID setPixels() {        // expose destination image's pixels as int array        int[] dest = new int[wIDth * height];        // fill in starting image contents based on last image's dispose code        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);                // copy pixels                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;                        }                    }                }            }        }        // copy each source line to the appropriate place in the destination        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);    }    /**     * Gets the image contents of frame n.     *     * @return BufferedBitmap representation of frame, or null if n is invalID.     */    public Bitmap getFrame(int n) {        if (frameCount <= 0)            return null;        n = n % frameCount;        return ((GifFrame) frames.elementAt(n)).image;    }    /**     * Reads GIF image from stream     *     * @param is     *          containing GIF file.     * @return read status code (0 = no errors)     */    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;        }        readComplete = true;        return status;    }    public voID complete()    {        readContents();        try {            in.close();        } catch (Exception e) {        }    }    /**     * Decodes LZW image data into pixel array. Adapted from John Cristy's BitmapMagick.     */    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];        }        // Initialize GIF data stream decoder.        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;        }        // Decode GIF pixel stream.        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;                }                // Get the next code.                code = datum & code_mask;                datum >>= code_size;                    bits -= code_size;                    // Interpret the code                    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;                    // Add a new string to the string table,                    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        }    }    /**     * Returns true if an error was encountered during reading/deCoding     */    protected boolean err() {        return status != STATUS_OK;    }    /**     * Initializes or re-initializes reader     */    protected voID init() {        status = STATUS_OK;        frameCount = 0;        frames = new Vector<GifFrame>();        gct = null;        lct = null;    }    /**     * Reads a single byte from the input stream.     */    protected int read() {        int curByte = 0;        try {            curByte = in.read();        } catch (Exception e) {            status = STATUS_FORMAT_ERROR;        }        return curByte;    }    /**     * Reads next variable length block from input.     *     * @return number of bytes stored in "buffer"     */    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;    }    /**     * Reads color table as 256 RGB integer values     *     * @param ncolors     *          int number of colors to read     * @return int array containing 256 colors (packed ARGB with full Alpha)     */    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;    }    /**     * Main file parser. Reads GIF content blocks.     */    protected voID readContents() {        // read GIF file content blocks        boolean done = false;        while (!(done || err())) {            int code = read();            switch (code) {            case 0x2C: // image separator            readBitmap();            if(!readComplete) return;            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;            }        }    }    /**     * Reads Graphics Control Extension values     */    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    }    /**     * Reads GIF file header information.     */    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];        }    }    /**     * Reads next frame image     */    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);        // 3 - sort flag        // 4-5 - reserved lctSize = 2 << (packed & 7); // 6-8 - local color        // table size        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();    }    /**     * Reads Logical Screen Descriptor     */    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    }    /**     * Reads netscape extenstion to obtain iteration count     */    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());    }    /**     * Reads next 16-bit value, LSB first     */    protected int readShort() {        // read 16-bit value, LSB first        return read() | (read() << 8);    }    /**     * resets frame state for reading next image.     */    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;    }    /**     * Skips variable length blocks up to and including next zero length block.     */    protected voID skip() {        do {            readBlock();        } while ((blockSize > 0) && !err());    }}

你可以从https://github.com/Hipmob/gifanimateddrawable/blob/master/src/com/hipmob/gifanimationdrawable/GifAnimationDrawable.java下载课程
 404未找到
https://gist.github.com/devunwired/4479231
 404未找到

如果以上任何链接未打开,您可以从下面的链接中找到该课程

希望这会节省一些时间很多,因为我从https://stackoverflow.com/a/11736861/3514144欣赏,但我想在imagevIEw中显示它

如果链接不可用,您也可以从Github找到课程.

总结

以上是内存溢出为你收集整理的android – 如何在imageview中显示.gif文件?全部内容,希望文章能够帮你解决android – 如何在imageview中显示.gif文件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1098746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存