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

所属分类: 软件编程 / Android 阅读数: 1399
收藏 0 赞 0 分享

前言

最近接手的项目里涉及到了 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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

Android动态加载Activity原理详解

这篇文章主要介绍了Android动态加载Activity原理详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android App中实现相册瀑布流展示的实例分享

这篇文章主要介绍了Android App中实现相册瀑布流展示的实例分享,例子中利用到了缓存LruCache类的相关算法来解决大量加载问题,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发中ImageLoder进行图片加载和缓存

这篇文章主要介绍了Android开发中ImageLoder进行图片加载和缓存的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Android Activity之间切换传递数据的方法

这篇文章主要介绍了详解Android Activity之间切换传递数据的方法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Android 手机卫士设置向导页面

这篇文章主要介绍了详解Android 手机卫士设置向导页面的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

深入浅析Android手机卫士保存密码时进行md5加密

一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密,接下来通过本文给大家介绍Android手机卫士保存密码时进行md5加密,需要的朋友一起学习
收藏 0 赞 0 分享

Android仿百度外卖自定义下拉刷新效果

大家在使用百度外卖的订餐的时候,会看到有个下拉刷新功能非常不错,今天小编就通过代码给大家介绍android仿百度外卖自定义下拉刷新,感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

详解Android中Service服务的基础知识及编写方法

这篇文章主要介绍了详解Android中Service服务的基础知识及编写方法,包括Service的启动流程及生命周期等基本内容,需要的朋友可以参考下
收藏 0 赞 0 分享

实例讲解Android中的AIDL内部进程通信接口使用

这篇文章主要通过实例介绍了Android中的AIDL内部进程通信接口使用,文中通过一个音乐播放的服务编写例子来讲解AIDL的传递对象及一般使用步骤,需要的朋友可以参考下
收藏 0 赞 0 分享

浅析Android系统的架构以及程序项目的目录结构

这篇文章主要介绍了Android系统的架构以及程序项目的目录结构,是安卓开发入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多