Android 解码播放GIF图像
Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过这里了解关于播放GIF的一种方法。 如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。 以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放: 首先,先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考。 之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下: packagecom.terry.gif; importandroid.content.Context; importandroid.content.res.TypedArray; importandroid.graphics.Bitmap; importandroid.graphics.Canvas; importandroid.graphics.Paint; importandroid.util.AttributeSet; importandroid.view.View; public class TypegifViewextendsViewimplementsRunnable{ gifOpenHelpergHelper; private booleanisStop = true ; int delta; Stringtitle; Bitmapbmp; // construct-referforjava public TypegifView(Contextcontext){ this (context, null ); } // construct-referforxml public TypegifView(Contextcontext,AttributeSetattrs){ super(context,attrs); // 添加属性 TypedArrayta = context.obtainStyledAttributes(attrs, R.styleable.gifView); int n = ta.getIndexCount(); for ( int i = 0 ;i < n;i ++ ){ int attr = ta.getIndex(i); switch (attr){ case R.styleable.gifView_src: int id = ta.getResourceId(R.styleable.gifView_src, 0 ); setSrc(id); break ; case R.styleable.gifView_delay: int idelta = ta.getInteger(R.styleable.gifView_delay, 1 ); setDelta(idelta); break ; case R.styleable.gifView_stop: booleansp = ta.getBoolean(R.styleable.gifView_stop, false ); if ( ! sp){ setStop(); } break ; } } ta.recycle(); } /* * *设置停止 * *@paramstop */ public void setStop(){ isStop = false ; } /* * *设置启动 */ public void setStart(){ isStop = true ; ThreadupdateTimer = new Thread( this ); updateTimer.start(); } /* * *通过下票设置第几张图片显示 *@paramid */ public void setSrc( int id){ gHelper = new gifOpenHelper(); gHelper.read(TypegifView. this .getResources().openRawResource(id)); bmp = gHelper.getImage(); // 得到第一张图片 } public void setDelta( int is ){ delta = is ; } // tomeaureitsWidth&Height @Override protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec){ setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureWidth( int measureSpec){ return gHelper.getWidth(); } private int measureHeight( int measureSpec){ return gHelper.getHeigh(); } protected void onDraw(Canvascanvas){ // TODOAuto-generatedmethodstub canvas.drawBitmap(bmp, 0 , 0 , new Paint()); bmp = gHelper.nextBitmap(); } public void run(){ // TODOAuto-generatedmethodstub while (isStop){ try { this .postInvalidate(); Thread.sleep(gHelper.nextDelay() / delta); } catch (Exceptionex){ } } } } 基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下: setContentView(R.layout.main); Buttonbtn = (Button)findViewById(R.id.Button01); Buttonbtn2 = (Button)findViewById(R.id.Button02); finalTypegifViewview = (TypegifView)findViewById(R.id.gifView1); btn.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ view.setStop(); } }); btn2.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ view.setStart(); } }); 显示效果: 源码参见:gifPlayer 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/478018,如需转载请自行联系原作者