`
Aina_hk55HK
  • 浏览: 387898 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android 播放GIF格式的图片

阅读更多
1.首先创建一个解码图像的类:

package com.Aina.Android;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;

public class GifDecoder
{
	private int					E0;
	private int					E1[];
	private int					E2;
	private int					E6;
	private boolean				E7;
	private int					E8[];
	private int					width;
	private int					height;
	private int					ED;
	private boolean				EE;
	private boolean				EF;
	private int					F0[];
	private int					F1;
	private boolean				F2;
	private int					F3;
	private long				F4;
	private int					F5;
	private static final int	F6[]	= { 8, 8, 4, 2 };
	private static final int	F8[]	= { 0, 4, 2, 1 };

	int							curFrame;
	int							poolsize;
	int							FA;
	byte						C2[];
	int							FB;
	int							FC;
	int							FD;


	public GifDecoder(byte abyte0[])
	{
		E0 = -1;
		E1 = new int[280];
		E2 = -1;
		E6 = 0;
		E7 = false;
		E8 = null;
		width = 0;
		height = 0;
		ED = 0;
		EE = false;
		EF = false;
		F0 = null;
		F1 = 0;
		F5 = 0;
		curFrame = 0;
		C2 = abyte0;
		poolsize = C2.length;
		FA = 0;
	}


	public boolean moreFrames()
	{
		return poolsize - FA >= 16;
	}


	public void nextFrame()
	{
		curFrame++;
	}


	public Bitmap decodeImage()
	{
		return decodeImage(curFrame);
	}


	public Bitmap decodeImage(int i)
	{
		if (i <= E0)
		{
			return null;
		}
		if (E0 < 0)
		{
			if (!E3())
			{
				return null;
			}
			if (!E4())
			{
				return null;
			}
		}
		do
		{
			if (!E9(1))
			{
				return null;
			}
			int j = E1[0];
			if (j == 59)
			{
				return null;
			}
			if (j == 33)
			{
				if (!E7())
				{
					return null;
				}
			}
			else if (j == 44)
			{
				if (!E5())
				{
					return null;
				}
				Bitmap image = createImage();
				E0++;
				if (E0 < i)
				{
					image = null;
				}
				else
				{
					return image;
				}
			}
		}
		while (true);
	}


	public void clear()
	{
		C2 = null;
		E1 = null;
		E8 = null;
		F0 = null;
	}


	private Bitmap createImage()
	{
		int i = width;
		int j = height;
		int j1 = 0;
		int k1 = 0;
		int ai[] = new int[4096];
		int ai1[] = new int[4096];
		int ai2[] = new int[8192];
		if (!E9(1))
		{
			return null;
		}
		int k = E1[0];
		int[] image = new int[width * height];
		int ai3[] = E8;
		if (EE)
		{
			ai3 = F0;
		}
		if (E2 >= 0)
		{
			ai3[E2] = 0xffffff;
		}
		int l2 = 1 << k;
		int j3 = l2 + 1;
		int k2 = k + 1;
		int l3 = l2 + 2;
		int k3 = -1;
		int j4 = -1;
		for (int l1 = 0; l1 < l2; l1++)
		{
			ai1[l1] = l1;
		}

		int j2 = 0;
		E2();
		j1 = 0;
		label0: for (int i2 = 0; i2 < j; i2++)
		{
			int i1 = 0;
			do
			{
				if (i1 >= i)
				{
					break;
				}
				if (j2 == 0)
				{
					int i4 = E1(k2);
					if (i4 < 0)
					{
						return Bitmap.createBitmap(image, width, height, Config.RGB_565);
					}
					if (i4 > l3 || i4 == j3)
					{
						return Bitmap.createBitmap(image, width, height, Config.RGB_565);
					}
					if (i4 == l2)
					{
						k2 = k + 1;
						l3 = l2 + 2;
						k3 = -1;
						continue;
					}
					if (k3 == -1)
					{
						ai2[j2++] = ai1[i4];
						k3 = i4;
						j4 = i4;
						continue;
					}
					int i3 = i4;
					if (i4 == l3)
					{
						ai2[j2++] = j4;
						i4 = k3;
					}
					for (; i4 > l2; i4 = ai[i4])
					{
						ai2[j2++] = ai1[i4];
					}

					j4 = ai1[i4];
					if (l3 >= 4096)
					{
						return Bitmap.createBitmap(image, width, height, Config.RGB_565);
					}
					ai2[j2++] = j4;
					ai[l3] = k3;
					ai1[l3] = j4;
					if (++l3 >= 1 << k2 && l3 < 4096)
					{
						k2++;
					}
					k3 = i3;
				}
				int l = ai2[--j2];
				if (l < 0)
				{
					return Bitmap.createBitmap(image, width, height, Config.RGB_565);
				}
				if (i1 == 0)
				{
					FC = 0;
					FB = ai3[l];
					FD = 0;
				}
				else if (FB != ai3[l])
				{

					for (int mm = FD; mm <= FD + FC; mm++)
					{
						image[j1 * width + mm] = FB;
					}
					FC = 0;
					FB = ai3[l];
					FD = i1;
					if (i1 == i - 1)
					{
						image[j1 * width + i1] = ai3[l];
					}
				}
				else
				{
					FC++;
					if (i1 == i - 1)
					{
						for (int mm = FD; mm <= FD + FC; mm++)
						{
							image[j1 * width + mm] = FB;
						}
					}
				}
				i1++;
			}
			while (true);
			if (EF)
			{
				j1 += F6[k1];
				do
				{
					if (j1 < j)
					{
						continue label0;
					}
					if (++k1 > 3)
					{
						return Bitmap.createBitmap(image, width, height, Config.RGB_565);
					}
					j1 = F8[k1];
				}
				while (true);
			}
			j1++;
		}

		return Bitmap.createBitmap(image, width, height, Config.RGB_565);
	}


	private int E1(int i)
	{
		while (F5 < i)
		{
			if (F2)
			{
				return -1;
			}
			if (F1 == 0)
			{
				F1 = E8();
				F3 = 0;
				if (F1 <= 0)
				{
					F2 = true;
					break;
				}
			}
			F4 += E1[F3] << F5;
			F3++;
			F5 += 8;
			F1--;
		}
		int j = (int) F4 & (1 << i) - 1;
		F4 >>= i;
		F5 -= i;
		return j;
	}


	private void E2()
	{
		F5 = 0;
		F1 = 0;
		F4 = 0L;
		F2 = false;
		F3 = -1;
	}


	private boolean E3()
	{
		if (!E9(6))
		{
			return false;
		}
		return E1[0] == 71 && E1[1] == 73 && E1[2] == 70 && E1[3] == 56 && (E1[4] == 55 || E1[4] == 57) && E1[5] == 97;
	}


	private boolean E4()
	{
		if (!E9(7))
		{
			return false;
		}
		int i = E1[4];
		E6 = 2 << (i & 7);
		E7 = EB(i, 128);
		E8 = null;
		return !E7 || E6(E6, true);
	}


	private boolean E5()
	{
		if (!E9(9))
		{
			return false;
		}
		width = EA(E1[4], E1[5]);
		height = EA(E1[6], E1[7]);
		int i = E1[8];
		EE = EB(i, 128);
		ED = 2 << (i & 7);
		EF = EB(i, 64);
		F0 = null;
		return !EE || E6(ED, false);
	}


	private boolean E6(int i, boolean flag)
	{
		int ai[] = new int[i];
		for (int j = 0; j < i; j++)
		{
			if (!E9(3))
			{
				return false;
			}
			ai[j] = E1[0] << 16 | E1[1] << 8 | E1[2] | 0xff000000;
		}

		if (flag)
		{
			E8 = ai;
		}
		else
		{
			F0 = ai;
		}
		return true;
	}


	private boolean E7()
	{
		if (!E9(1))
		{
			return false;
		}
		int i = E1[0];
		int j = -1;
		switch (i)
		{
			case 249:
				j = E8();
				if (j < 0)
				{
					return true;
				}
				if ((E1[0] & 1) != 0)
				{
					E2 = E1[3];
				}
				else
				{
					E2 = -1;
				}
				break;
		}
		do
		{
			j = E8();
		}
		while (j > 0);
		return true;
	}


	private int E8()
	{
		if (!E9(1))
		{
			return -1;
		}
		int i = E1[0];
		if (i != 0 && !E9(i))
		{
			return -1;
		}
		else
		{
			return i;
		}
	}


	private boolean E9(int i)
	{
		if (FA + i >= poolsize)
		{
			return false;
		}
		for (int j = 0; j < i; j++)
		{
			int k = C2[FA + j];
			if (k < 0)
			{
				k += 256;
			}
			E1[j] = k;
		}

		FA += i;
		return true;
	}


	private static final int EA(int i, int j)
	{
		return j << 8 | i;
	}


	private static final boolean EB(int i, int j)
	{
		return (i & j) == j;
	}
}



2.创建一个管理GIF帧管理器的类:

package com.Aina.Android;

import java.util.Vector;
import android.graphics.Bitmap;

public class GifFrame
{	
	/* 保存gif中所有帧的向量 */
    private Vector<Bitmap> frames;
    
    /* 当前播放的帧的索引 */
    private int index;

    public GifFrame() 
    {
    	frames = new Vector<Bitmap>(1);
        index = 0;
    }
    
    /* 添加一帧 */
    public void addImage(Bitmap image) 
    {
    	frames.addElement(image);
    }

    /* 返回帧数 */
    public int size() 
    {
        return frames.size();
    }

    /* 得到当前帧的图片 */
    public Bitmap getImage() 
    {
        if (size() == 0) 
        {
            return null;
        } 
        else 
        {
            return (Bitmap) frames.elementAt(index);
        }
    }

    /* 下一帧 */
    public void nextFrame() 
    {
        if (index + 1 < size()) 
        {
            index++;
        } 
        else 
        {
            index = 0;
        }
    }
    
    /* 创建GifFrame */
    public static GifFrame CreateGifImage(byte abyte0[]) 
    {
        try 
        {
        	GifFrame GF = new GifFrame();
        	Bitmap image = null;
            GifDecoder gifdecoder = new GifDecoder(abyte0);
            for (; gifdecoder.moreFrames(); gifdecoder.nextFrame()) 
            {
                try 
                {
                    image = gifdecoder.decodeImage();
                    if (GF != null && image != null) 
                    {
                        GF.addImage(image);
                    }
                    continue;
                }
                catch (Exception e) 
                {
                	e.printStackTrace();
                }
                break;
            }
            gifdecoder.clear();
            gifdecoder = null;
            return GF;
        } 
        catch (Exception e) 
        {
        	e.printStackTrace();
            return null;
        }
    } 
}




3.View类播放:

package com.Aina.Android;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

/**
 * com.Aina.Android Pro_GIF
 * 
 * @author Aina.huang E-mail: 674023920@qq.com
 * @version 创建时间:2010 Jun 18, 2010 3:34:59 PM 类说明
 */
public class GameView extends View implements Runnable{

	private GifFrame mGifFrame = null;
	private Paint mPaint = null;
	public GameView(Context context) {
		super(context);
		mGifFrame = GifFrame.CreateGifImage(this.fileConnect(this
				.getResources().openRawResource(R.drawable.gif1)));
		new Thread(this).start();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		mPaint = new Paint();
		mGifFrame.nextFrame();//下一帧
		Bitmap bitmap = mGifFrame.getImage();//得到当前帧的图片
		if(bitmap != null){
			canvas.drawBitmap(bitmap, 0, 0, mPaint);
		}
	}

	/**
	 * 读取文件
	 * 
	 * @param in
	 * @return
	 */
	public byte[] fileConnect(InputStream in) {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		int ch = 0;
		try {
			while ((ch = in.read()) != -1) {
				out.write(ch);
			}
			byte[] b = out.toByteArray();
			out.close();
			out = null;
			in.close();
			in = null;
			return b;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}

	}

	public void run() {
		while(!Thread.interrupted()){
			try{
				Thread.sleep(100);
				this.postInvalidate();
			}catch(Exception ex){
				ex.printStackTrace();
				Thread.currentThread().interrupt();
			}
		}
	}
}



4.Activity类启动:

package com.Aina.Android;

import android.app.Activity;
import android.os.Bundle;

public class Test_Gif extends Activity {
	/** Called when the activity is first created. */
	private GameView gv = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		gv = new GameView(this);
		setContentView(gv);
	}
}
分享到:
评论

相关推荐

    android_gif_drawable(播放gif图片)

    通过以上步骤,你就可以在Android应用中轻松播放GIF图片了。`android_gif_drawable`库的使用不仅简化了开发流程,还提高了性能,使得动态图像的展示更加高效和流畅。在实际项目中,你可以结合具体的业务场景,灵活...

    android中gif格式图片的显示

    在Android开发中,由于系统默认不提供专门用于显示GIF动画的控件,开发者需要通过第三方库或者自定义控件的方式来实现GIF图片的播放。本文将深入探讨如何在Android应用中显示GIF格式的图片,并提供一种实现方法。 ...

    android播放gif图片动画

    在Android开发中,有时我们需要在应用中展示动态的GIF图片,这通常涉及到对GIF动画的播放。本文将深入探讨如何在Android平台上实现在应用中播放GIF动画,并介绍一个已经封装好的jar包,方便开发者直接使用。 GIF是...

    android gif图片循环显示

    2. **GIFView库**:`GIFView`是一个专门为Android设计的轻量级库,它能够轻松地加载和播放GIF图片。首先,你需要在项目的`build.gradle`文件中添加依赖,例如: ```groovy implementation '...

    android播放gif图片

    在Android平台上,播放GIF图片是一项常见的需求,无论是用于加载动画、表情符号还是其他动态展示。本示例将深入探讨如何在Android应用中实现这一功能,以帮助开发者更好地理解和运用。 首先,我们要知道GIF是一种...

    Android 播放gif图片

    Android的原生控件并不支持播放GIF...我们都知道,在Android中如果想要显示一张图片,可以借助ImageView控件来完成,但是如果将一张GIF图片设置到ImageView里,它只会显示这张图片的第一帧,不会产生任何的动画效果。

    android gif图片播放、暂停

    本文将深入探讨如何使用`pl.droidsonroids.gif:android-gif-drawable`库来实现GIF图片的播放和暂停功能。 首先,`pl.droidsonroids.gif:android-gif-drawable`是一个强大的Android库,专门用于处理GIF图像。它提供...

    Android中播放gif图片的控件

    本篇文章将详细介绍如何在Android应用中播放GIF图片,主要涉及三种方法:自定义控件播放、使用Glide库以及使用`android-gif-drawable`库。 首先,我们来探讨**自定义控件播放GIF**的方法。这种方法适用于对自定义...

    android播放gif动画

    在Android平台上,播放GIF动画是一项常见的需求,无论是用于加载指示器、表情符号还是其他动态效果。本篇文章将深入探讨如何在Android应用中实现GIF动画的播放,并提供相关的技术知识点。 首先,我们需要理解GIF...

    Android播放Gif图片

    在Android平台上,播放Gif图片是一项常见的需求,无论是用于加载动图表情、动画效果还是其他交互元素。要实现这一功能,开发者需要理解Android系统对Gif格式的支持以及如何利用现有库来播放Gif。以下是一些关键知识...

    android播放gif格式图片示例

    代码如下:import android.content.Context;import android.graphics.Canvas;import android.graphics.Movie;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup....

    android 播放gif图片DEMO

    本DEMO主要展示了如何在Android应用中实现GIF图片的播放功能。以下将详细讲解涉及的知识点: 1. **Android视图系统**:Android的视图系统是构建用户界面的基础,包括ImageView、TextView等。在这个DEMO中,我们将...

    解决Android4.3彩信幻灯片中gif格式图片不能正常播放

    2. **多媒体框架适配**:可能需要对Android的多媒体框架进行调整,确保GIF图片在幻灯片中的播放逻辑得以支持。这可能包括修改或扩展`MediaExtractor`、`MediaCodec`等组件,使其能够识别并处理GIF格式。 3. **UI...

    android 播放gif文件

    在Android平台上,播放GIF文件是一项常见的需求,无论是用于加载动态表情、动画效果还是其他交互设计。本篇文章将深入探讨如何在Android应用中实现GIF文件的播放。 首先,了解GIF格式。GIF(Graphics Interchange ...

    Android播放Gif动态图片

    在Android开发中,实现Gif动态图片的播放是一项常见的需求,尤其在社交、游戏或UI设计中。本篇文章将深入探讨如何在Android应用中自定义一个`GifView`组件来实现这一功能。 首先,我们需要了解GIF图像格式。GIF是一...

    android gif图片播放

    本篇将详细讲解如何在Android中实现GIF图片的动态播放,主要围绕标题"android gif图片播放"和描述中的内容展开。 首先,我们要知道GIF是一种支持多帧动画的图像格式,它通过连续播放一系列静态图像来实现动态效果。...

    Android GIF图片播放实现

    首先,Android系统本身并不直接支持GIF格式的动态图片播放。因此,我们需要借助第三方库来实现这一功能。在描述中提到的“导入代码即可运行”,通常是指引入一个成熟的GIF库,如Android-Universal-Image-Loader、 ...

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

    然而,需要注意的是,虽然`android-gif-drawable`库做了很多优化,但GIF本身是一种比较消耗资源的格式。在处理大量或者高分辨率的GIF时,仍可能对设备性能造成影响。因此,开发者应当谨慎使用,尤其是在内存有限的...

Global site tag (gtag.js) - Google Analytics