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

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

  如果前面有了解过的朋友肯定知道这上面的做法比较麻烦,又要去分解图片,又要写各种麻烦的XML文件,有点郁闷,而且还带来的直接后果是一个比较多动作的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();

  }

  });

  显示效果:

时间: 2024-08-25 07:23:57

Android 平台实现Gif 图像解码并播放代码及组件的相关文章

android mediacodec-大侠求助啊,Android mediacodec解码.264 播放

问题描述 大侠求助啊,Android mediacodec解码.264 播放 现在已经可以用preview callback获取yuv数据传入mediacodec里面进行264编码,并且对关键帧写入sps头等,然后输出到.264为后缀的文件.把这个文件拖到电脑上可以用暴风影音播放.现在我想在手机上播放这个文件,求指导!拟用mediacodec解码,可惜解码后的数据不知道怎么处理成能播放的格式.求指导! 解决方案 http://www.eoeandroid.com/thread-548149-1-

14款Android平台音乐播放器横评

测试产品介绍手机的越来越智能化相当大的程度都要通过软件和应用来体现,盛放的移动互联网 应用市场给我们带来了各门类的诸多精品应用,音乐播放器市场更是如此,除了传统单一的本地播放功能, Android平台的音乐播放器已经衍生出支持多格式.歌曲信息多合一提供.资源不仅依靠本地而且靠移动互联网提供.辅助功能完善的多种或集百家精粹,或有一技之长的精品播放器.如何在如此百家争鸣的音乐播放器中选择一款全能或者适合的播放器,为此手机频道特别推出Android手机音乐播放器横评,为大家的选择提供强有力的解读和支持

快速解决Android平台移植ffmpeg的一些问题_Android

IT行业是一个踩在巨人肩膀上前进的行业,否则做的事情不一定有意义,所以我也是基于havlenapetr移植的ffmpeg基础上做了些改进,他做的主要贡献有: 1. 移植了ffmpeg并将与媒体相关的结构体在java层重新进行了封装,方便应用程序在java层直接操作ffmpeg API,如各种媒体格式转码及播放,如图1所示 2. 模仿Android的MediaPlayer类实现了ffmpeg的播放接口,如setDataSource(),setDisplay(),start(), stop(),pa

Android 使用Vitamio打造自己的万能播放器(10)—— 本地播放 (缩略图、视频信息、视频扫描服务)_Android

前言  Vitamio是我们团队的诚意之作,除了要将VPlayer打造成Android最好的播放器,也要将Vitamio打造成Android最好的播放器组件.新版发布内测SDK虽然还有一些问题,但已经具备高可扩展性.便捷性和许多内置实用的功能,后续文章将继续深挖和介绍Vitamio的使用细节和方法.本章将提供显示缩略图.视频大小等视频信息,并介绍使用Vitamio内置的ContentProvider以及文件扫描服务. 注意  本章ContentProvider在2012-8-31发布的SDK中已

Android平台全新Ui定制 百度云Rom刷机体验

百度云Rom来袭 Android系统以其高度的开放性受到了众多玩机用户的青睐,而也正因为此,Android平台上有着众多的第三方Rom.但是很多个人Rom都是在成熟Rom的基础上进行修改的,真正做到全新Ui定制,全新功能整合的Rom只有大厂团队才能完成,比如今天要体验的--百度云Rom. 在百度云Rom支持刷入的手机中,小编选择了一款配置相对较低的机型作为体验对象,这样可以了解百度云Rom对于低端配置的支持情况. 手机型号:华为 C8812 操作系统:Android OS 4.0 CPU型号:高

Speex 回音消除 在android 平台上 初见成效

也不知和上一篇,你们二位是同一位仁兄不,所以,还是分着转载吧! Speex 回音消除 在android 平台上 初见成效 搞了将近一个月的时间,将Speex的编码和解码做好了,发现还不错. 参考API,又尝试了回音消除,发现最新版还提供了用于在多线程中的playback()和capture(),有了这两个函数,就可以避免在线程中不能同步的问题. 结果,发现虽然进行了回音有了部分消除,但是,还是会一点啸叫以及回声,想来还是要做一点处理,譬如去噪,减小播放或者来音的增益. 在使用了speex提供的

Android平台下利用zxing实现二维码开发

现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发. 1.如何将zxing的Android源码导入工程. 在导入zxing的android源码之前,先去官方下载zxing的源码:http://code.google.com/p/zxing/downloads/list. 我这里下载的是

Android平台利用ZXING生成二维码图片

zxing是google的一个开源二维码项目,目前基本上和二维码打交道的东西,都会用到它. 最近项目中用到了android手机需要根据提供的字符串生成二维码图片,之前用zxing做过二维码解码,编码还没做过,看了一些demo都是用到了zxing的j2se包的内容,这个在android或者其他平台上显然无法实现,所以我们要利用zxing生成二维矩阵,然后根据android平台的提供的api来生成图片. /** * 用字符串生成二维码 * @param str * @author zhouzhe@l

Android平台进入数字家庭领域

8月6日消息, 业界标准处理器架构与内核厂商MIPS科技公司(MIPS Technologies, Inc) 今天宣布,为推动 Android?平台进入手机以外应用领域所做的努力实现了重要里程碑进展.就在宣布将 Android 平台移植到 MIPS? 架构两个月后,MIPS 科技已开始对大众公开源代码,同时也已针对少数重要客户启动了一项"早期使用计划"(Early Access Program),让他们能够在正式公开前,先使用特定硬件和程序代码优化.这些客户将与 MIPS 科技的工程团