Android实现GIF图片解码与播放
2015-12-18 10:50
573 查看
Android实现GIF图片解码与播放
如何在Android中播放GIF图片呢?如果直接按以前的方法,分解图片,可能相对比较麻烦。今天给大伙介绍一种新的方式,构造自己的Android图片解码帮助类,直接在Android解码GIF图片,还可以实现播放功能。
下面先请看一GIF图:
我们以此美图为示例,解码GIF。
先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。
之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:
package com.terry.gif;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class TypegifView extends View implements Runnable {
gifOpenHelper gHelper;
private boolean isStop = true;
int delta;
String title;
Bitmap bmp;
// construct - refer for java
public TypegifView(Context context) {
this(context, null);
}
// construct - refer for xml
public TypegifView(Context context, AttributeSet attrs) {
super(context, attrs);
//添加属性
TypedArray ta = 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:
boolean sp = ta.getBoolean(R.styleable.gifView_stop, false);
if (!sp) {
setStop();
}
break;
}
}
ta.recycle();
}
/**
* 设置停止
*
* @param stop
*/
public void setStop() {
isStop = false;
}
/**
* 设置启动
*/
public void setStart() {
isStop = true;
Thread updateTimer = new Thread(this);
updateTimer.start();
}
/**
* 通过下票设置第几张图片显示
* @param id
*/
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;
}
// to meaure its Width & 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(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(bmp, 0, 0, new Paint());
bmp = gHelper.nextBitmap();
}
public void run() {
// TODO Auto-generated method stub
while (isStop) {
try {
this.postInvalidate();
Thread.sleep(gHelper.nextDelay() / delta);
} catch (Exception ex) {
}
}
}
}
基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.Button01);
Button btn2 = (Button) findViewById(R.id.Button02);
final TypegifView view = (TypegifView) findViewById(R.id.gifView1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
view.setStop();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
view.setStart();
}
});
显示效果:
源码下载:gifPlayer
相关文章推荐
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- android键值传递
- 移植NFC驱动到android系统
- android 5.1+ Notification
- 360浏览器文本框获得焦点后被android软键盘遮罩该怎么办
- Android应用开发-小巫CSDN博客client之显示博文具体内容
- Android自定义RatingBar,图片可缩放
- Notification KeyguardDone Pending
- Android 开发——如何显示 GIF 动画
- Android使用Intent启动其他非系统应用程序的方法
- Android打包的那些事
- Android中Parcelable接口用法
- Android各种自带工具类
- AndroidStudio百度地图定位功能的集成
- File.listFiles() 结果返回为null
- android开源图表库MPAndroidChart
- Android Studio开发安卓插件
- Android慎用layout嵌套, 尽量控制在5层以下java.lang.StackOverflowError
- 照片墙的Adapter——Android照片墙应用实现,再多的图片也不怕崩溃
- Bitmap.Options和LruCache——Android高效加载大图、多图解决方案,有效避免程序OOM