`

Android 解码Gif 图像并播放

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

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



首先,先编写一个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();
	}
});


显示效果:



源码见附件,gifPlayer.rar


转自:http://android.gbsou.com/2011/09/06/android-gif-image-decoding-and-playback/
  • 大小: 30.1 KB
  • 大小: 23.5 KB
分享到:
评论

相关推荐

    Android-android-gif-drawable用于在Android上显示动画GIF

    在Android应用开发中,有时我们需要在界面上展示动态GIF图像,这时`android-gif-drawable`库就显得非常实用。这个库是专门为在Android平台上高效、流畅地播放GIF动画而设计的。本文将深入探讨如何使用`android-gif-...

    android gif图片循环显示

    在Android中,处理这种格式的图片需要特别的方法,因为默认的ImageView组件并不支持GIF动画。 要实现在Android应用中显示GIF图片,我们可以使用以下几种方法: 1. **利用第三方库**:由于Android原生API对GIF支持...

    个人整理的Android下Gif文件播放工具

    - `GifDrawable`是AndroidX库中的一个类,专门用于处理Gif图像,可以作为自定义组件的基础。 2. **自定义GifPlayer类** - 自定义`GifPlayer`类可能包含关键方法,如`loadGif()`用于加载Gif文件,`startAnimation...

    android-gif-drawable

    首先,"android-gif-drawable" 提供了强大的 GIF 解码和播放功能。它能够处理各种复杂的 GIF 文件,包括那些带有透明度通道或不同帧速率的文件。在 Android 系统原生支持相对较弱的情况下,这个库可以确保 GIF 图像...

    android gif图片播放

    在Android开发中,GIF图片的动态显示是一个常见的需求,...总的来说,Android中显示GIF图片需要借助第三方库或自定义视图,理解其内部的解码和动画播放机制,同时关注性能和兼容性优化,确保在不同设备上都能流畅运行。

    Android gif完美播放及播放监听

    在布局XML文件中,创建一个ImageView或自定义View,用于显示GIF图像: ```xml android:id="@+id/gif_view" android:layout_width="wrap_content" android:layout_height="wrap_content" /&gt; ``` 3. 加载并...

    异步GIF图像解码器和图像查看器支持播放GIF图像 它只是使用更少的内存.zip

    异步解码意味着该库会在后台线程中进行GIF图像的解码工作,不会阻塞主线程,从而提高了用户体验,特别是对于那些需要频繁加载和播放GIF的应用程序来说。这有助于避免应用因处理复杂图像任务而出现的卡顿现象。 ...

    Android应用源码之android-gif-drawable 支持fig显示的view.zip

    它使用一个内部的`GifDecoder`类来解码GIF图像,`GifDecoder`会将GIF的逻辑屏幕描述、图像描述、图形控制扩展等信息解析出来。`GifDrawable`根据这些信息创建一个帧缓冲区,然后在适当的时间间隔内切换帧,实现动画...

    一个Android播放gif的Demo

    这个名为"一个Android播放gif的Demo"的项目提供了一个实例,展示了如何在Android应用中实现GIF图像的播放功能。下面,我们将深入探讨相关的Android开发知识以及GIF图片处理技术。 1. **Android图像显示库** 在...

    Android 使用gif图

    Android原生API并没有提供对GIF的直接支持,但在API Level 24及更高版本中,Android引入了`android.graphics.Movie`类,可以解析和播放GIF图像。然而,这个类并不适合在UI线程中使用,因为它可能导致应用卡顿。因此...

    Android 显示GIF动画源码

    本示例源码“GifViewDemo”提供了一种实现方式,旨在帮助开发者理解如何在Android应用中集成并播放GIF动图。下面我们将深入探讨相关知识点。 首先,Android系统本身并不支持直接在ImageView中播放GIF动画,因此我们...

    Android-AGMobileGift简化与GIF图像的交互

    在Android开发中,处理动态图像是一个常见的需求,特别是GIF图像,它们广泛用于表情、动画效果等场景。AGMobileGift库就是专为简化Android应用与GIF图像交互而设计的工具。这篇详解将深入探讨如何利用AGMobileGift库...

    Android之gif动画实现

    Android系统提供了一个名为`android.graphics.Movie`的类,它可以解析GIF文件并播放。首先,我们需要从资源文件中读取GIF数据,然后创建Movie对象,通过`Movie.decodeStream()`方法解码。之后,我们可以在`onDraw()...

    Android 播放Gif 动画

    在Android平台上,播放Gif动画是一项常见的需求,无论是加载指示器、按钮反馈还是其他动态展示效果,Gif图像都能提供丰富的视觉体验。本篇将详细探讨如何在Android应用中实现Gif动画的播放。 首先,我们需要理解Gif...

    Android Studio Gif图播放器

    在Android开发中,有时我们需要在应用中展示动态的GIF图像,这通常涉及到对GIF文件的处理。本文将深入探讨如何使用Android Studio中的`GifDrawable`类来实现Gif图的播放功能。 首先,`GifDrawable`是Android支持库...

    android显示gif图片完整代码

    在Android平台上,显示GIF动画图像可能比显示静态图片复杂一些,因为Android原生API并不直接支持GIF的播放。然而,通过第三方库或者自定义控件,我们可以轻松实现这一功能。以下是一个关于如何在Android应用中显示...

    Android播放Gif图片

    2. **Android原生支持**:Android API 24(Nougat)及以上版本提供了`AnimatedGifDrawable`类,可以直接读取并播放Gif。然而,对于低于API 24的设备,需要借助第三方库。 3. **第三方库**:两个常用的库是`...

    android 加载gif动画

    在Android中,原生的ImageView组件并不支持直接加载和播放GIF动画,因此我们需要借助第三方库或者自定义View来实现。 1. **第三方库**: - **NineOldAndroids**:这是一款兼容Android 2.1及以上的库,用于提供对...

    android版gif播放器

    不过,随着Android的发展,从API 24(Nougat)开始,系统引入了`android.graphics.Movie`类,可以解析并显示GIF图像。但这个类并不适用于复杂的GIF播放需求,如循环播放、进度控制等。因此,开发者通常会依赖第三方...

    android之Gif处理(解决GIF显示容易OOM问题,包括代码和说明),非常详细的介绍

    在Android开发中,GIF图像由于其动态特性,经常被用于动画展示,但同时也带来了内存管理的挑战。GIF文件通常较大,如果处理不当,很容易引发`OutOfMemoryError`(OOM)异常,导致应用崩溃。本篇文章将深入探讨如何在...

Global site tag (gtag.js) - Google Analytics