android 监听gif播放,Glide4.0 以后 监听Gif播放完成
在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播放完成相关推荐
- Android软键盘弹出和收起的监听
Android软键盘弹出和收起的监听 1.直接调用 SoftKeyboardHelper softKeyboardHelper = softKeyboardHelper = new SoftKeybo ...
- android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...
在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听 ...
- Android监听作用,Android开发之CheckBox的简单使用与监听功能示例
本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...
- android datepicker 监听,Android编程之DatePicker和TimePicke简单时间监听用法分析
本文实例讲述了Android编程之DatePicker和TimePicke简单时间监听用法.分享给大家供大家参考,具体如下: DatePicker和TimePicker都是从FrameLayout派生 ...
- ubuntu服务器上,求生之路2服务器如何把监听地址改为0.0.0.0
今天准备尝试用rcon密码连接控制台的时候,出现了问题,由于游戏监听地址是127.0.1.1,导致无法远程连接,今天自己摸索了下解决了问题. 方法一:由于求生之路2服务器不属于内部自带的服务器,因此网 ...
- vue判断是否双击_vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作...
Vue 事件处理方法 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. v-on:click 单击事件 + + - - v-on:dblclick 双击事件 ...
- Android 12.0 系统多个播放器app时,设置默认播放器
目录 1.概述 2.系统多个播放器app时,设置默认播放器的核心类
- 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器
上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...
- Android开发笔记(一百二十六)自定义音乐播放器
MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...
最新文章
- 【ICML2021】随机森林机器遗忘
- python发送微信消息_用python批量发送微信消息
- Flutter开发之布局-4-container(18)
- linux shell touch更新文件时间
- 某电世界------青龙面板
- python在哪里学比较好-新手从Python的哪个版本开始学比较好?
- json的键为变量而不是字符串时,怎么写?
- Python编程专属骚技巧10
- 什么影响了数据库的性能?
- 常见的CSS和HTML面试题
- Xavier Initialization 的理解与推导(及实现)
- 如何设置pycharm代码字体
- 解决maven不能自动导入ojdbc14的问题
- pkpm弹性时程分析计算书怎么出_一套软件,带你掌握复杂建筑结构分析方法
- python组合数据类型分类_《Python程序设计与案例教程》课件chap6组合数据类型.ppt...
- 基于JAVA广西科技大学第一附属医院陪护椅管理计算机毕业设计源码+数据库+lw文档+系统+部署
- 如何注册Line账号?-Line账号/Line广告/Line好友
- 第十届蓝桥杯真题题解
- 卸载Photoshop
- 用宝塔面板网站php变成静态,宝塔面板设置伪静态规则
热门文章
- 工具 | Plant UML介绍及使用
- Matlab多次重复实验记录结果,MATLAB数据处理实验记录与总结.doc
- [Swift]LeetCode493. 翻转对 | Reverse Pairs
- (转)申请企业级IDP、真机调试、游戏接入GameCenter 指南、游戏接入OpenFeint指南;...
- 【零基础】极星9.3资金字段详解
- 通达信目录文件结构及说明
- iOS 疑难杂症 学习笔记
- EXCEL中 xls 与xlsx 的区别
- TWS蓝牙耳机哪款适合新手?双11五款高性价比低延迟蓝牙耳机推荐
- windows server 2016 搭建AD域服务