android 解码 gif 时间,Android实现GIF图片解码与播放

本文介绍了如何在Android中使用自定义帮助类简化GIF图片的解码过程,创建了一个继承自View的TypegifView组件,实现实时切换GIF图片并支持播放控制。通过实例代码展示了如何设置启动/停止GIF和响应按钮点击事件。
摘要由CSDN通过智能技术生成

如何在Android中播放GIF图片呢?如果直接按以前的方法,分解图片,可能相对比较麻烦。

今天给大伙介绍一种新的方式,构造自己的Android图片解码帮助类,直接在Android解码GIF图片,还可以实现播放功能。

下面先请看一GIF图:

c044ec7e6529c04902a4b1c76e1e1b62.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 

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();

}

});

显示效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值