您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 安卓开发 >> 正文

Android 平台实现Gif 图像解码并播放代码及组件

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   Android 播放GIF之前就有过一篇文章是讲述如何使用GIF文件并播放。可以通过 这里 了解关于播放GIF的一种方法。

  如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的GIF图片可能会将项目的体积变大,这点很多朋友都无法接受。不过这样的好处也显而易见,就是运行的速度会比你去解码的速度要快。

  以下这种方法是需要解码,但是速度的话保证不了,可能开线程的时候没有处理好吧,以下面这张图片为例做解码播放:

Android 平台实现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();

  }

  });

  显示效果: