Android 解码Gif 图像并播放
程序员文章站
2022-03-24 22:22:58
...
Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放
如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。
以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放:
[img]http://dl.iteye.com/upload/attachment/556898/0d37e99a-2bec-315e-b37f-06f04e5c5bc5.gif[/img]
首先,先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。
之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:
基础功能实现后。可通过view.start()开启GIF的播放,或者view.stop()停止GIF的播放,代码如下:
显示效果:
[img]http://dl.iteye.com/upload/attachment/556907/dc3b12b8-817c-3e11-9e12-ef8d334e0245.png[/img]
源码见附件,gifPlayer.rar
转自:http://android.gbsou.com/2011/09/06/android-gif-image-decoding-and-playback/
如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。
以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放:
[img]http://dl.iteye.com/upload/attachment/556898/0d37e99a-2bec-315e-b37f-06f04e5c5bc5.gif[/img]
首先,先编写一个GIF解码的帮助类,该类提供了几个操作GIF图片的方法,比如图片的初始化呀,切换图片呀,获得整个GIF的组合数量等等,由于代码量太多,这里就不列出来,后面会提供源码供大家参考,可于源码内找到该帮助类。
之后,编写一个用于可显示Gif 的组件,继承自View 并实现了Runable,代码如下:
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 {
private GifOpenHelper gHelper;
private boolean isStop = true;
private int delta;
private Bitmap bmp;
private Paint paint;
// construct - refer for java
public TypegifView(Context context) {
this(context, null);
paint = new Paint();
}
// 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();
paint = new Paint();
}
/**
* 设置停止
*
* @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) {
canvas.drawBitmap(bmp, 0, 0, paint);
bmp = gHelper.nextBitmap();
}
public void run() {
while (isStop) {
try {
this.postInvalidate();
Thread.sleep(gHelper.nextDelay() / delta);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
基础功能实现后。可通过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();
}
});
显示效果:
[img]http://dl.iteye.com/upload/attachment/556907/dc3b12b8-817c-3e11-9e12-ef8d334e0245.png[/img]
源码见附件,gifPlayer.rar
转自:http://android.gbsou.com/2011/09/06/android-gif-image-decoding-and-playback/
下一篇: 钉钉小程序头像剪切并压缩上传
推荐阅读
-
android播放gif格式图片示例
-
Android图片处理:识别图像方向并显示实例教程
-
Android NDK开发之旅–NDK-FFmpeg音频解码与播放
-
Android开发如何加载WebView中的H5页面并全屏视频播放
-
Android-JNI开发系列实践-利用Android C源码实现GIF图片的播放
-
android 加载 .gif 并一直刷新实现方法
-
android播放gif动画控件(例子)
-
Android录屏并利用FFmpeg转换成gif(三) 在Android中使用ffmpeg命令
-
Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码
-
Android 显示和控制gif动态图片的播放