刚开始的时候觉得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分源码拿走