鸿 网 互 联 www.68idc.cn

Android中播放GIF图片动画

来源:互联网 作者:佚名 时间:2015-06-03 08:51
引言 在Android中 默认情况下是不允许播放GIF图片动画的 这时需要自己实现来播放GIF动画 在网上搜索了一个可用的实现 贴出来与大家共享 功能实现 ( ) 主Activity实现 package com focus fishme; import android app Activity; import android os Bundle; pub

   引言

  在Android中默认情况下是不允许播放GIF图片动画的这时需要自己实现来播放GIF动画在网上搜索了一个可用的实现贴出来与大家共享

   功能实现

  () 主Activity实现

  



package comfocusfishme;   
import androidappActivity;   
import androidosBundle;   
publicclass GIFPlayerActivity extends Activity {   

@Override
publicvoid onCreate(Bundle savedInstanceState) {   
superonCreate(savedInstanceState);   

        GameView gameView = new GameView(this);   

        setContentView(gameView);   
    }   

}  

  () GIF图片动画View

  



package comfocusfishme;   
import javaioByteArrayOutputStream;   
import javaioIOException;   
import javaioInputStream;   
import ntentContext;   
import androidgraphicsBitmap;   
import androidgraphicsCanvas;   
import androidgraphicsPaint;   
import androidviewView;   
publicclass GameView extends View implements Runnable {   
private GIFFrameManager mGIFFrameManager = null;   
private Paint mPaint = null;   
public GameView(Context context) {   
super(context);   
        mGIFFrameManager = GIFFrameManagerCreateGifImage(thisfileConnect(this
                getResources()openRawResource(Rdrawablecat)));   
new Thread(this)start();   
    }   
protectedvoid onDraw(Canvas canvas) {   
superonDraw(canvas);   
        mPaint = new Paint();   
        mGIFFrameManagernextFrame();   
        Bitmap bitmap = mGIFFrameManagergetImage();   
if (bitmap != null) {   
            canvasdrawBitmap(bitmap   mPaint);   
        }   
    }   
publicbyte[] fileConnect(InputStream in) {   
        ByteArrayOutputStream out = new ByteArrayOutputStream();   
int ch = ;   
try {   
while ((ch = inread()) != ) {   
                outwrite(ch);   
            }   
byte[] b = outtoByteArray();   
            outclose();   
            out = null;   
            inclose();   
            in = null;   
return b;   
        } catch (IOException e) {   
            eprintStackTrace();   
returnnull;   
        }   
    }   
publicvoid run() {   
while (!Threadinterrupted()) {   
try {   
                Threadsleep();   
thispostInvalidate();   
            } catch (Exception ex) {   
                exprintStackTrace();   
                ThreadcurrentThread()interrupt();   
            }   
        }   
    }   
}   

  () GIF图片动画播放管理器

  



package comfocusfishme;   
import javautilVector;   
import androidgraphicsBitmap;   
publicclass GIFFrameManager {   

private Vector<Bitmap> frames;   
privateint index;   
public GIFFrameManager() {   
        frames = new Vector<Bitmap>();   
        index = ;   
    }   
publicvoid addImage(Bitmap image) {   
        framesaddElement(image);   
    }   
publicint size() {   
return framessize();   
    }   
public Bitmap getImage() {   
if (size() == ) {   
returnnull;   
        } else {   
return (Bitmap) frameselementAt(index);   
        }   
    }   
publicvoid nextFrame() {   
if (index +  < size()) {   
            index++;   
        } else {   
            index = ;   
        }   
    }   
publicstatic GIFFrameManager CreateGifImage(byte bytes[]) {   
try {   
            GIFFrameManager GF = new GIFFrameManager();   
            Bitmap image = null;   
            GIFEncoder gifdecoder = new GIFEncoder(bytes);   
for (; gifdecodermoreFrames(); gifdecodernextFrame()) {   
try {   
                    image = gifdecoderdecodeImage();   
if (GF != null && image != null) {   
                        GFaddImage(image);   
                    }   
continue;   
                } catch (Exception e) {   
                    eprintStackTrace();   
                }   
break;   
            }   
            gifdecoderclear();   
            gifdecoder = null;   
return GF;   
        } catch (Exception e) {   
            eprintStackTrace();   
returnnull;   
        }   
    }   
}  

  () GIF图片动画编码

  



package comfocusfishme;   
import androidgraphicsBitmap;   
import androidgraphicsBitmapConfig;   
publicclass GIFEncoder {   
privateint E;   
privateint E[];   
privateint E;   
privateint E;   
privateboolean E;   
privateint E[];   
privateint width;   
privateint height;   
privateint ED;   
privateboolean EE;   
privateboolean EF;   
privateint F[];   
privateint F;   
privateboolean F;   
privateint F;   
privatelong F;   
privateint F;   
privatestaticfinalint F[] = {     };   
privatestaticfinalint F[] = {     };   
int curFrame;   
int poolsize;   
int FA;   
byte C[];   
int FB;   
int FC;   
int FD;   
public GIFEncoder(byte abyte[]) {   
        E = ;   
        E = newint[];   
        E = ;   
        E = ;   
        E = false;   
        E = null;   
        width = ;   
        height = ;   
        ED = ;   
        EE = false;   
        EF = false;   
        F = null;   
        F = ;   
        F = ;   
        curFrame = ;   
        C = abyte;   
        poolsize = Clength;   
        FA = ;   
    }   
publicboolean moreFrames() {   
return poolsize  FA >= ;   
    }   
publicvoid nextFrame() {   
        curFrame++;   
    }   
public Bitmap decodeImage() {   
return decodeImage(curFrame);   
    }   
public Bitmap decodeImage(int i) {   
if (i <= E) {   
returnnull;   
        }   
if (E < ) {   
if (!E()) {   
returnnull;   
            }   
if (!E()) {   
returnnull;   
            }   
        }   
do {   
if (!E()) {   
returnnull;   
            }   
int j = E[];   
if (j == ) {   
returnnull;   
            }   
if (j == ) {   
if (!E()) {   
returnnull;   
                }   
            } elseif (j == ) {   
if (!E()) {   
returnnull;   
                }   
                Bitmap image = createImage();   
                E++;   
if (E < i) {   
                    image = null;   
                } else {   
return image;   
                }   
            }   
        } while (true);   
    }   
publicvoid clear() {   
        C = null;   
        E = null;   
        E = null;   
        F = null;   
    }   
private Bitmap createImage() {   
int i = width;   
int j = height;   
int j = ;   
int k = ;   
int ai[] = newint[];   
int ai[] = newint[];   
int ai[] = newint[];   
if (!E()) {   
returnnull;   
        }   
int k = E[];   
int[] image = newint[width * height];   
int ai[] = E;   
if (EE) {   
            ai = F;   
        }   
if (E >= ) {   
            ai[E] = xffffff;   
        }   
int l =  << k;   
int j = l + ;   
int k = k + ;   
int l = l + ;   
int k = ;   
int j = ;   
for (int l = ; l < l; l++) {   
            ai[l] = l;   
        }   
int j = ;   
        E();   
        j = ;   
        labelfor (int i = ; i < j; i++) {   
int i = ;   
do {   
if (i >= i) {   
break;   
                }   
if (j == ) {   
int i = E(k);   
if (i < ) {   
return BitmapcreateBitmap(image width height   
                                ConfigRGB_);   
                    }   
if (i > l || i == j) {   
return BitmapcreateBitmap(image width height   
                                ConfigRGB_);   
                    }   
if (i == l) {   
                        k = k + ;   
                        l = l + ;   
                        k = ;   
continue;   
                    }   
if (k == ) {   
                        ai[j++] = ai[i];   
                        k = i;   
                        j = i;   
continue;   
                    }   
int i = i;   
if (i == l) {   
                        ai[j++] = j;   
                        i = k;   
                    }   
for (; i > l; i = ai[i]) {   
                        ai[j++] = ai[i];   
                    }   
                    j = ai[i];   
if (l >= ) {   
return BitmapcreateBitmap(image width height   
                                ConfigRGB_);   
                    }   
                    ai[j++] = j;   
                    ai[l] = k;   
                    ai[l] = j;   
if (++l >=  << k && l < ) {   
                        k++;   
                    }   
                    k = i;   
                }   
int l = ai[j];   
if (l < ) {   
return BitmapcreateBitmap(image width height   
                            ConfigRGB_);   
                }   
if (i == ) {   
                    FC = ;   
                    FB = ai[l];   
                    FD = ;   
                } elseif (FB != ai[l]) {   
for (int mm = FD; mm <= FD + FC; mm++) {   
                        image[j * width + mm] = FB;   
                    }   
                    FC = ;   
                    FB = ai[l];   
                    FD = i;   
if (i == i  ) {   
                        image[j * width + i] = ai[l];   
                    }   
                } else {   
                    FC++;   
if (i == i  ) {   
for (int mm = FD; mm <= FD + FC; mm++) {   
                            image[j * width + mm] = FB;   
                        }   
                    }   
                }   
                i++;   
            } while (true);   
if (EF) {   
                j += F[k];   
do {   
if (j < j) {   
continue label;   
                    }   
if (++k > ) {   
return BitmapcreateBitmap(image width height   
                                ConfigRGB_);   
                    }   
                    j = F[k];   
                } while (true);   
            }   
            j++;   
        }   
return BitmapcreateBitmap(image width height ConfigRGB_);   
    }   
privateint E(int i) {   
while (F < i) {   
if (F) {   
return ;   
            }   
if (F == ) {   
                F = E();   
                F = ;   
if (F <= ) {   
                    F = true;   
break;   
                }   
            }   
            F += E[F] << F;   
            F++;   
            F += ;   
            F;   
        }   
int j = (int) F & ( << i)  ;   
        F >>= i;   
        F = i;   
return j;   
    }   
privatevoid E() {   
        F = ;   
        F = ;   
        F = L;   
        F = false;   
        F = ;   
    }   
privateboolean E() {   
if (!E()) {   
returnfalse;   
        }   
return E[] ==  && E[] ==  && E[] ==  && E[] == 
                && (E[] ==  || E[] == ) && E[] == ;   
    }   
privateboolean E() {   
if (!E()) {   
returnfalse;   
        }   
int i = E[];   
        E =  << (i & );   
        E = EB(i );   
        E = null;   
return !E || E(E true);   
    }   
privateboolean E() {   
if (!E()) {   
returnfalse;   
        }   
        width = EA(E[] E[]);   
        height = EA(E[] E[]);   
int i = E[];   
        EE = EB(i );   
        ED =  << (i & );   
        EF = EB(i );   
        F = null;   
return !EE || E(ED false);   
    }   
privateboolean E(int i boolean flag) {   
int ai[] = newint[i];   
for (int j = ; j < i; j++) {   
if (!E()) {   
returnfalse;   
            }   
            ai[j] = E[] <<  | E[] <<  | E[] | xff;   
        }   
if (flag) {   
            E = ai;   
        } else {   
            F = ai;   
        }   
returntrue;   
    }   
privateboolean E() {   
if (!E()) {   
returnfalse;   
        }   
int i = E[];   
int j = ;   
switch (i) {   
case:   
            j = E();   
if (j < ) {   
returntrue;   
            }   
if ((E[] & ) != ) {   
                E = E[];   
            } else {   
                E = ;   
            }   
break;   
        }   
do {   
            j = E();   
        } while (j > );   
returntrue;   
    }   
privateint E() {   
if (!E()) {   
return ;   
        }   
int i = E[];   
if (i !=  && !E(i)) {   
return ;   
        } else {   
return i;   
        }   
    }   
privateboolean E(int i) {   
if (FA + i >= poolsize) {   
returnfalse;   
        }   
for (int j = ; j < i; j++) {   
int k = C[FA + j];   
if (k < ) {   
                k += ;   
            }   
            E[j] = k;   
        }   
        FA += i;   
returntrue;   
    }   
privatestaticfinalint EA(int i int j) {   
return j <<  | i;   
    }   
privatestaticfinalboolean EB(int i int j) {   
return (i & j) == j;   
    }   
}   

网友评论
<