在Glide3.0的时候,我们可以通过GifDecoder获取每一帧的播放时长然后相加得到gif的播放时长,即:

GifDrawable drawable = (GifDrawable) glideDrawable;

GifDecoder decoder = drawable.getDecoder();

long duration = 0;

for (int i = 0; i < drawable.getFrameCount(); i++) {

duration += decoder.getDelay(i);

}

然后使用handle 发送一个延时消息,或者其它方法,等gif播放完成以后再做相应操作。

或者,通过重写GifDrawable,重写onStop()方法来处理:

public  class MyGifDrawable extends GifDrawable {

public MyGifDrawable (GifDrawable other) {

this(other, other.getFirstFrame(), other.getFrameTransformation());

}

@Override

public void stop() {

super.stop();

//GIF播放完成,可以做一些操作

}

}

但是到Glide4.0, GifDecoder 被声明为private,去掉了getDecoder()方法,第一种方法如果不使用反射,是无法做到的。

这时我们可以去重写GifDrawable,MyGifDrawable 继承自GifDrawable,然后我们去获GifDrawable里边存储的gif的数据,然后重新初始化一个GifDecoder,使用这个GifDecoder重新new 一个MyGifDrawable ,在MyGifDrawable 的stop方法中监听gif播放完成的时机。

public  class MyGifDrawable extends GifDrawable {

public MyGifDrawable (Context context, GifDecoder bitmapProvider, Transformation frameTransformation, int targetFrameWidth, int targetFrameHeight, Bitmap firstFrame) {

super(context, bitmapProvider, frameTransformation, targetFrameWidth, targetFrameHeight, firstFrame);

}

@Override

public void stop() {

super.stop();

//这里之所以要判断callBack是否为null,是因为在RecycleView中当gif划出屏幕,然后再划入屏幕时,callback会为null,

//在GifDrawable中的onFrameReady()方法,会判断如果callback为null,会直接会调用onstop方法,当gif图在recycleview中,划出//屏幕再划入屏幕时,callback会为null,这是就会出现,当第一帧刚准备好显示出来,就会马上调用onstop()方法,为避免这种情况,在此加入//下方这个判断。

if (getCallback() != null) {

//GIF播放完成,可以做一些操作

}

}

}

可以在Glide的RequestListener中的onResourceReady中拿到glide解析好的gifDrawable,来调用以下方法初始化我们自己定义的GifDrawable

public static MyGifDrawable initMyGifDrawable(Context context, GifDrawable gifDrawable) {

GifBitmapProvider provider = new GifBitmapProvider(Glide.get(context).getBitmapPool());

Transformation transformation = gifDrawable.getFrameTransformation();

if (transformation == null) {

transformation = new CenterCrop();

}

ByteBuffer byteBuffer = gifDrawable.getBuffer();

StandardGifDecoder decoder = new StandardGifDecoder(provider);

decoder.setData(new GifHeaderParser().setData(byteBuffer).parseHeader(),byteBuffer);

Bitmap bitmap = gifDrawable.getFirstFrame();

if (bitmap == null) {

decoder.advance();

bitmap = decoder.getNextFrame();

}

return new MyGifDrawable(context, decoder, transformation, 0, 0, bitmap);

}

当然也可以使用以下方法来通过Glide拿到图片的二进制数组,来初始化MyGifDrawable :

// target.get() 必须放到子线程中执行,方法中未做处理,所以此方法必须在子线程中执行

public static MyGifDrawable loadGif(final Context context, final String url, final RequestOptions options) {

byte[] data = null;

FutureTarget target = Glide.with(context)

.as(byte[].class)

.load(url)

.apply(options)

.into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);

try {

data = target.get();

} catch (Exception e) {

e.printStackTrace();

}

return initMyGifDrawable(context, data);

}

public static MyGifDrawable initMyGifDrawable(Context context, byte[] data) {

if (data == null) {

return null;

}

GifBitmapProvider provider = new GifBitmapProvider(Glide.get(context).getBitmapPool());

Transformation transformation = new CenterCrop();

StandardGifDecoder decoder = new StandardGifDecoder(provider);

decoder.read(data);

decoder.advance();

Bitmap bitmap = decoder.getNextFrame();

return new MyGifDrawable(context, decoder, transformation, 0, 0, bitmap);

}

最后拿到MyGifDrawable的对象后,可以调用setLoopCount() 来设置循环次数,调用start()方法开始gif的播放

转载至链接:https://my.oschina.net/u/3364122/blog/1831883

android 监听gif播放,Glide4.0 以后 监听Gif播放完成相关推荐

  1. Android软键盘弹出和收起的监听

    Android软键盘弹出和收起的监听 1.直接调用 SoftKeyboardHelper softKeyboardHelper = softKeyboardHelper = new SoftKeybo ...

  2. android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...

    在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听 ...

  3. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

  4. android datepicker 监听,Android编程之DatePicker和TimePicke简单时间监听用法分析

    本文实例讲述了Android编程之DatePicker和TimePicke简单时间监听用法.分享给大家供大家参考,具体如下: DatePicker和TimePicker都是从FrameLayout派生 ...

  5. ubuntu服务器上,求生之路2服务器如何把监听地址改为0.0.0.0

    今天准备尝试用rcon密码连接控制台的时候,出现了问题,由于游戏监听地址是127.0.1.1,导致无法远程连接,今天自己摸索了下解决了问题. 方法一:由于求生之路2服务器不属于内部自带的服务器,因此网 ...

  6. vue判断是否双击_vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作...

    Vue 事件处理方法 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. v-on:click 单击事件 + + - - v-on:dblclick 双击事件 ...

  7. Android 12.0 系统多个播放器app时,设置默认播放器

    目录 1.概述 2.系统多个播放器app时,设置默认播放器的核心类

  8. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器

    上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...

  9. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

最新文章

  1. 【ICML2021】随机森林机器遗忘
  2. python发送微信消息_用python批量发送微信消息
  3. Flutter开发之布局-4-container(18)
  4. linux shell touch更新文件时间
  5. 某电世界------青龙面板
  6. python在哪里学比较好-新手从Python的哪个版本开始学比较好?
  7. json的键为变量而不是字符串时,怎么写?
  8. Python编程专属骚技巧10
  9. 什么影响了数据库的性能?
  10. 常见的CSS和HTML面试题
  11. Xavier Initialization 的理解与推导(及实现)
  12. 如何设置pycharm代码字体
  13. 解决maven不能自动导入ojdbc14的问题
  14. pkpm弹性时程分析计算书怎么出_一套软件,带你掌握复杂建筑结构分析方法
  15. python组合数据类型分类_《Python程序设计与案例教程》课件chap6组合数据类型.ppt...
  16. 基于JAVA广西科技大学第一附属医院陪护椅管理计算机毕业设计源码+数据库+lw文档+系统+部署
  17. 如何注册Line账号?-Line账号/Line广告/Line好友
  18. 第十届蓝桥杯真题题解
  19. 卸载Photoshop
  20. 用宝塔面板网站php变成静态,宝塔面板设置伪静态规则

热门文章

  1. 工具 | Plant UML介绍及使用
  2. Matlab多次重复实验记录结果,MATLAB数据处理实验记录与总结.doc
  3. [Swift]LeetCode493. 翻转对 | Reverse Pairs
  4. (转)申请企业级IDP、真机调试、游戏接入GameCenter 指南、游戏接入OpenFeint指南;...
  5. 【零基础】极星9.3资金字段详解
  6. 通达信目录文件结构及说明
  7. iOS 疑难杂症 学习笔记
  8. EXCEL中 xls 与xlsx 的区别
  9. TWS蓝牙耳机哪款适合新手?双11五款高性价比低延迟蓝牙耳机推荐
  10. windows server 2016 搭建AD域服务