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

作者:smartbeng 时间:2023-12-08 18:15:01 

前言

最近接手的项目里涉及到了 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 的控制,对我遇到的需求提供了良性支持!

来源:http://www.jianshu.com/p/210bd8c161a9

标签:android,gif,播放控制
0
投稿

猜你喜欢

  • spring boot如何加入mail邮件支持

    2021-09-27 15:12:57
  • Android应用开发中WebView的常用方法笔记整理

    2021-06-29 04:29:39
  • 23种设计模式(1) java单例模式

    2021-08-28 21:56:28
  • java编程下字符串的16位,32位md5加密实现方法

    2023-07-29 21:34:28
  • C#配置文件Section节点处理总结

    2022-09-21 06:29:08
  • 解决mybatis 中collection嵌套collection引发的bug

    2023-03-20 20:55:39
  • Android的Fragment的生命周期各状态和回调函数使用

    2022-12-10 17:44:34
  • Reactor中的onErrorContinue 和 onErrorResume

    2022-12-01 14:30:58
  • SpringMVC响应视图和结果视图详解

    2022-03-07 05:08:37
  • 深入解析Java多态进阶学习

    2022-05-16 16:06:55
  • insert语句太长用StringBuilder优化一下

    2023-03-29 17:56:44
  • 详解SpringBoot中Session超时原理说明

    2022-01-24 06:40:49
  • datatables 带查询条件java服务端分页处理实例

    2023-12-24 08:48:16
  • Mybatis如何使用ognl表达式实现动态sql

    2021-06-22 03:34:49
  • 一文精通Java中的volatile关键字

    2023-11-24 04:17:14
  • Android7.0自动更新适配 包解析异常

    2022-02-13 11:21:00
  • 简述Mybatis增删改查实例代码

    2023-03-06 18:07:53
  • c++代码调试方式的几点建议

    2023-07-05 05:31:35
  • Android的OkHttp包处理用户认证的代码实例分享

    2022-04-25 00:00:52
  • C#实现视频的批量剪辑功能

    2023-07-15 06:18:30
  • asp之家 软件编程 m.aspxhome.com