android下播放gif图片功能似乎并不常用,很多时候还是以展示静态图片为主,可能是由于gif图体积比较大吧。不过像表情动画什么的,可能还是需要gif图的。本文主要给大家介绍了关于Android中GIF动图的播放控制和监听的相关资料,需要的朋友可以参考下。
前言
最近接手的项目里涉及到了 GIF 动图的播放与监听,在上一版本中对于 GIF 的处理是由 H5 来实现的,因为考虑到用户体验,因此现在的需求是将这块儿原生化,途中差点误入歧途!下面来看看详细的介绍吧。
Android 中 GIF 动图处理与监听
刚开始第一个想到的便是 glide , 但是自认为 glide 不能够控制 GIF 以及去监听它,所以网上去搜寻别的方法。看到有一个方案是将图片分帧,一张张的去用逐帧动画来实现。
我开始怀疑给这个解决方案的人了,都什么时代了还做这种费力不讨好,大量占用用户内存的东西!于是乎动手前又仔细 Google 了一番,答案着实令我尴尬,glide 是可以控制 GIF 动画的!!!
怒上代码 :使用glide 加载 GIF 动图
1
|
Glide.with(DoorActivity.
this
).load(R.drawable.opendoor).into(openDoorGif);
|
很简单的一行代码就可以搞定,以上方式图片和动图都可以加载(网络链接亦可)
下面是只可以加载 GIF 动图的写法:
1
|
Glide.with(DoorActivity.
this
).load(R.drawable.opendoor).asGif().into(openDoorGif);
|
其实就多了个 asGIF
但是这种方式下的动图播放一直是循环的,有什么方式可以停下来呢!没遇到过千万别说没必要,假如现在有一个需求,需要点击一下按钮来播放一次 GIF 实现与用户的交互呢?这个技能我想你肯定是要 get 的,因为类似需求你迟早会碰到!
下面写法实现了对 GIF 动图的控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
//handler发送消息成功的状态码
private
static
final
int
MESSAGE_SUCCESS =
4424
;
//handler发送消息所携带的参数(持续时间)
private
int
duration;
/**
* 加载开门Gif动图(只播放一次)
* @param view
*/
public
void
loadGif(View view){
Glide.with(
this
)
.load(R.drawable.opendoor)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.listener(
new
RequestListener<Integer, GlideDrawable>() {
@Override
public
boolean
onException(Exception arg0, Integer arg1,
Target<GlideDrawable> arg2,
boolean
arg3) {
return
false
;
}
@Override
public
boolean
onResourceReady(GlideDrawable resource,
Integer model, Target<GlideDrawable> target,
boolean
isFromMemoryCache,
boolean
isFirstResource) {
// 计算动画时长
GifDrawable drawable = (GifDrawable) resource;
GifDecoder decoder = drawable.getDecoder();
for
(
int
i =
0
; i < drawable.getFrameCount(); i++) {
duration += decoder.getDelay(i);
}
//发送延时消息,通知动画结束
//以下两个参数都是 int 型,记得如上的声明
handler.sendEmptyMessageDelayed(MESSAGE_SUCCESS,
duration);
return
false
;
}
})
//仅仅加载一次gif动画
//此处的参数 1 及时指明播放次数
.into(
new
GlideDrawableImageViewTarget(openDoorGif,
1
));
}
|
使用这种方式就可以完美的实现对 GIF 的控制,对我遇到的需求提供了良性支持!
总结
以上就是这篇文章的全部内容了,希望本文的内容对给位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。