Gif图完美运行——自定义Gif图

刚开始的时候觉得android好像没有提供什么接口直接来显示一个Gif图的,后来网上查了资料要么是运行不了,要么是用第三方组件,有好多自己想干的事干不了,实在是很不爽。终于有时间可以搞一搞了,废话不多说了。

我的实现是用动画类来实现的,将Gif图处理成很多图片,然后循环播放图片,达到Gif的效果。主要代码如下:

/**
 * 自定义GIF
 * 
 * @author luckchoudog 可以播放动态图片
 */
public class AnimationImageView extends ImageView {
	private AnimationDrawable anim;
	private Handler handler;

	public AnimationImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public AnimationImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public AnimationImageView(Context context) {
		super(context);
	}

	public interface OnFrameAnimationListener {
		/**
		 * 动画开始播放后调用
		 */
		void onStart();

		/**
		 * 动画结束播放后调用
		 */
		void onEnd();
	}

	/**
	 * 不带动画监听的播放
	 * 
	 * @param resId
	 */
	public void loadAnimation(int resId) {
		setImageResource(resId);
		anim = (AnimationDrawable) getDrawable();
		anim.start();
	}

	/**
	 * 带动画监听的播放
	 * 
	 * @param resId
	 * @param listener
	 */
	public void loadAnimation(int resId, final OnFrameAnimationListener listener) {
		setImageResource(resId);
		anim = (AnimationDrawable) getDrawable();
		anim.start();
		if (listener != null) {
			// 调用回调函数onStart
			listener.onStart();
		}

		// 计算动态图片所花费的事件
		int durationTime = 0;
		for (int i = 0; i < anim.getNumberOfFrames(); i++) {
			durationTime += anim.getDuration(i);
		}

		// 动画结束后
		handler = new Handler();
		handler.postDelayed(new Runnable() {
			@Override
			public void run() {
				if (listener != null) {
					// 调用回调函数onEnd
					listener.onEnd();
				}
			}
		}, durationTime);
	}
}
使用方法很简单,自己new也行,在xml文件中用也行,具体看个人喜好,不会的留言教你。

主要用到的有两个方法,loadAnimation(int resId) 不带动画监听的播放GIF和 loadAnimation(int resId, final OnFrameAnimationListener listener)   带动画监听的播放GIF,监听回掉OnFrameAnimationListener中的onStart()和onEnd()方法。

接下来自己组装一个GIF图,这里用到animation-list标签,例如:

<?xml version="1.0" encoding="utf-8"?>
<!-- 
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度
 -->
<animation-list
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="true"
  >
  	<item android:drawable="@drawable/besg00042" android:duration="150"></item>
  	<item android:drawable="@drawable/besg00041" android:duration="150"></item>
  	<item android:drawable="@drawable/besg00042" android:duration="200"></item>
  	<item android:drawable="@drawable/besg00041" android:duration="200"></item>
</animation-list>
这里的item都是我处理过的图片,大家用的时候用自己的就ok了。

使用的时候首先获取AnimationImageView实例,然后loadAnimation将资源id传入就ok了,比方说:

animationImageView.loadAnimation(R.drawable.XXX);
好了,再多说也不如看例子, 0分源码拿走





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值