Android实现GIF图片解码与播放
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实现GIF图片解码与播放的更多相关文章
- H.264视频在android手机端的解码与播放(转)
随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其 ...
- 如何让Android 支持HEIF 图片解码和加载(免费的方法)
字节跳动火山引擎ImageX提供了一种能力,可以支持客户端android 直接解码HEIF 和HEIC图片,经过测试发现,可以免费使用: 一.阅前准备 HEIF图片格式是什么? 高效率图像格式(Hig ...
- Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)
Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...
- Android开发教程AnimationDrawable逐帧播放动画
下面我们一起来看篇Android开发AnimationDrawable控制逐帧播放动画实现过程,希望文章对各位朋友带不一些帮助. 当我们点击按钮时,该图片会不停的旋转,当再次点击按钮时,会停止在当前的 ...
- android 开发对gif解码(适配android 4.2、4.3、4.4版本)
android 开发对gif解码(适配android 4.2.4.3.4.4版本) 使用方法: public class ImageInputActivity extends Activity imp ...
- Andorid-如何为你的Android应用缩放图片
很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?为了寻求一个好的解决方案,我们咨询了Andreas Agvard(索尼爱立信软件部门), ...
- Android应用--简、美音乐播放器增加音量控制
Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...
- Android显示GIF图片
今天我们研究一下怎样在Android手机上显示GIF动态图片 首先须要在src文件夹下新建一个自己定义的View.代码例如以下: </pre><pre name="code ...
- android 加载图片框架--Glide使用详解
一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...
随机推荐
- HttpModule的基本概念
注:本文为个人学习摘录,原文地址:http://www.cnblogs.com/stwyhm/archive/2006/08/09/471765.html HttpModule是如何工作的 当一个HT ...
- Leetcode015 3Sum
public class S015 { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); ...
- NYOJ-71 独木舟上的旅行 (贪心)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- freemarker遍历list中的map
前台: <select id="jq" name="jq" class="tsui" data-required="true ...
- RLE行程长度编码压缩算法
在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息! 特点 一种压缩过的位图文件格式,RLE压缩方案是一种极其成熟的压 ...
- android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[ ...
- BaLaBaLa
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<a ...
- 用sqlyog远程连接LINUX系统的MYSQL出现错解决方法
无法给远程连接的用户权限问题.结果这样子操作mysql库,即可解决.在本机登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称'%' ...
- 将GridView导入到Excel
前几天做项目需要用到将GridView中的数据导入到Excel,原以为很简单,上网搜了一下资料,果然方法不少,于是就采用了一个: private void GridViewToExcel() { Re ...
- JavaScript高级程序设计:第十七章
错误处理与调试 一.错误处理 1.try-catch语句: ECMA-262第3版引入了try-catch语句,作为javascript中处理异常的一种标准方式.基本的语法如下: try { //可能 ...