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

发布时间 - 2026-01-11 01:13:04    点击率:

前言

最近接手的项目里涉及到了 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  # gif播放  # gif播放控件  # gif播放一次  # Android使用glide加载gif动画设置播放次数  # Android实现可播放GIF动画的ImageView  # Android中播放Gif动画取巧的办法  # android播放gif格式图片示例  # Android自定义View播放Gif动画的示例  # 加载  # 来实现  # 就可以  # 有一个  # 都是  # 发送消息  # 有什么  # 我想  # 对我  # 第一个  # 是由  # 误入歧途  # 上一  # 很简单  # 来看看  # 考虑到  # 人了  # 刚开始  # 这块  # 令我 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  怎么用AI帮你设计一套个性化的手机App图标?  网站建设保证美观性,需要考虑的几点问题!  Laravel怎么在Blade中安全地输出原始HTML内容  Python文本处理实践_日志清洗解析【指导】  如何在Windows 2008云服务器安全搭建网站?  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  佛山企业网站制作公司有哪些,沟通100网上服务官网?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何快速搭建FTP站点实现文件共享?  JS弹性运动实现方法分析  如何快速搭建高效可靠的建站解决方案?  Java遍历集合的三种方式  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何在阿里云域名上完成建站全流程?  企业网站制作这些问题要关注  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Python自动化办公教程_ExcelWordPDF批量处理案例  高端网站建设与定制开发一站式解决方案 中企动力  jQuery中的100个技巧汇总  如何在IIS服务器上快速部署高效网站?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel如何使用Telescope进行调试?(安装和使用教程)  网站制作免费,什么网站能看正片电影?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  iOS验证手机号的正则表达式  Laravel如何记录自定义日志?(Log频道配置)  如何在宝塔面板中创建新站点?  微信小程序 input输入框控件详解及实例(多种示例)  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  公司网站制作价格怎么算,公司办个官网需要多少钱?  什么是javascript作用域_全局和局部作用域有什么区别?  个人网站制作流程图片大全,个人网站如何注销?  JavaScript如何实现音频处理_Web Audio API如何工作?  如何在香港免费服务器上快速搭建网站?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  EditPlus中的正则表达式 实战(4)  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】