欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中GIF动图的播放控制和监听详解

程序员文章站 2023-11-29 11:43:52
前言 最近接手的项目里涉及到了 gif 动图的播放与监听,在上一版本中对于 gif 的处理是由 h5 来实现的,因为考虑到用户体验,因此现在的需求是将这块儿原生化,途中差...

前言

最近接手的项目里涉及到了 gif 动图的播放与监听,在上一版本中对于 gif 的处理是由 h5 来实现的,因为考虑到用户体验,因此现在的需求是将这块儿原生化,途中差点误入歧途!下面来看看详细的介绍吧。

android 中 gif 动图处理与监听

刚开始第一个想到的便是 glide , 但是自认为 glide 不能够控制 gif 以及去监听它,所以网上去搜寻别的方法。看到有一个方案是将图片分帧,一张张的去用逐帧动画来实现。

我开始怀疑给这个解决方案的人了,都什么时代了还做这种费力不讨好,大量占用用户内存的东西!于是乎动手前又仔细 google 了一番,答案着实令我尴尬,glide 是可以控制 gif 动画的!!!

怒上代码 :使用glide 加载 gif 动图

glide.with(dooractivity.this).load(r.drawable.opendoor).into(opendoorgif);

很简单的一行代码就可以搞定,以上方式图片和动图都可以加载(网络链接亦可)

下面是只可以加载 gif 动图的写法:

glide.with(dooractivity.this).load(r.drawable.opendoor).asgif().into(opendoorgif);

其实就多了个 asgif

但是这种方式下的动图播放一直是循环的,有什么方式可以停下来呢!没遇到过千万别说没必要,假如现在有一个需求,需要点击一下按钮来播放一次 gif 实现与用户的交互呢?这个技能我想你肯定是要 get 的,因为类似需求你迟早会碰到!

下面写法实现了对 gif 动图的控制

//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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。