首页 > 其他分享 >看我一行代码起飞,Glide加载gif优化实践

看我一行代码起飞,Glide加载gif优化实践

时间:2023-11-07 16:34:45浏览次数:39  
标签:load Glide into gif Android 加载

看我一行代码起飞,Glide加载gif优化实践_加载

前言

最近项目中有使用到gif动画,加上本身已经引入了Glide (支持gif)库,所以便用Glide来加载了;但在使用过程中还是遇到了不少困难, 在此记录下,希望可以给遇到类似问题的你一些思考和建议。

看我一行代码起飞,Glide加载gif优化实践_加载_02

一、Glide加载gif

1.在项目中添加依赖

dependencies {
 compile 'com.github.bumptech.glide:glide:4.0.0'
 compile 'com.android.support:support-v4:25.3.1'
}

Glide需要依赖Support Library v4

2.加载图片

// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
 ...
 ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

 Glide.with(this)
.load("http://goo.gl/gEgYUd")
.into(imageView);
}
// For a simple image list:
@Override public View getView(int position, View recycled, ViewGroup container) {
 final ImageView myImageView;
 if (recycled == null) {
 myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
 } else {
 myImageView = (ImageView) recycled;
 }

 String url = myUrls.get(position);

 Glide
 .with(myFragment)
 .load(url)
 .centerCrop()
 .placeholder(R.drawable.loading_spinner)
 .into(myImageView);

 return myImageView;
}
//不使用它的默认动画
Glide.with(mContext)
 .load(url) 
 .dontAnimate()
 .placeholder(R.drawable.loading_spinner)
 .into(circleImageview);

提示:不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext

3.加载GIF

如果只是简单加载gif,其实跟加载普通图片一样

Glide.with(this).load(mGifUrl).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

如果希望加载gif时只加载gif的第一帧,把gif当作普通图片一样加载,那么只需要加上asBitmap方法即可

Glide.with(this).load(mGifUrl).asBitmap().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

如果你希望加载的只是gif,如果不是gif就显示错误图片,那么只用加上asGif方法即可

Glide.with(this).load(mGifUrl).asGif().placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

网络上很多文章上都是从一篇译文里面拷贝过来的,里面说Glide可以加载本地视频,但是那篇译文漏翻译一句了,Glide只会加载本地视频的第一帧,也就是缩略图,而且其实加载缩略图的时候也无需转化为Uri,直接把File丢进去就行了

mVideoFile = new File(Environment.getExternalStorageDirectory(), "xiayu.mp4");

 Glide.with(this).load(mVideoFile).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);

在大多数情况下,当你使用diskCacheStrategy(DiskCacheStrategy.SOURCE)时,Gif的加载速度会显着提高(其实就是把gif资源缓存到磁盘)->可以解决gif加载慢或加载不出来的情况(NONE是不缓存数据,SOURCE是缓存原型,原图)

Glide.with(this).load(mGifUrl).diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(R.mipmap.place)
.error(R.mipmap.icon_photo_error)
.into(mIv);

动态显示gif图的次数,比如我想显示一次gif就停止

Glide.with(this).load("url").diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(new GlideDrawableImageViewTarget(iv, 1));

这里的GlideDrawableImageViewTarget(ImageView view, int maxLoopCount)这个方法,maxloopCount可以控制显示次数。

看我一行代码起飞,Glide加载gif优化实践_ide_03

二、Glide加载gif优化

1.解决Glide加载Gif非常慢问题

Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);

为其添加缓存策略,其中缓存策略可以为:Source及None,None及为不缓存,Source缓存原型.如果为ALL和Result就不行

2.加载第一贞:

Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);

3.控制动画次数:

Glide.with(this).load(getResource()).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(new GlideDrawableImageViewTarget(imageView, 1));

4.GIF 时间:

Glide.with(FirstActivity.this)

.load(file)

.asGif()

.fitCenter()

.diskCacheStrategy(DiskCacheStrategy.SOURCE)

.listener(new RequestListener<File, GifDrawable>() {

@Override

public boolean onException(Exception e, File model, Target<GifDrawable> target, boolean isFirstResource) {

return false;

}

@Override

public boolean onResourceReady(final GifDrawable resource, File model, Target<GifDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {

new Thread(new Runnable() {

@Override

public void run() {

int duration = 0;

try {

GifDrawable gifDrawable = (GifDrawable) resource;

GifDecoder decoder = gifDrawable.getDecoder();

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

duration += decoder.getDelay(i);

}

mGifAdTime = duration;

} catch (Throwable e) {

}

}

}).start();

return false;

}

})

.into(mAdImg);

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` )

标签:load,Glide,into,gif,Android,加载
From: https://blog.51cto.com/u_16163452/8236495

相关文章

  • moviepy音视频剪辑-音视频的加载和输出
    一、概述在本地进行音视频处理时,首先要从视频文件进行音视频加载,最后要将处理结果输出到文件。本节介绍moviepy的音视频的加载和输出方法。二、视频加载2.1、视频加载方法要从视频文件中加载视频非常简单,使用VideoFileClip类的构造方法即可完成加载。其构造方法语法如下:__init__......
  • selenium等待元素加载,元素操作,执行js,切换选项卡,前进后退,异常处理,登录cnblogs,抽
    1selenium等待元素加载......
  • JS脚本实现刷新页面,随机加载背景图片
    新建switch.js,内容如下: varimgs=[ "https://mlabs.gitee.io/pics/webp/tiankong002-mid.webp", "https://mlabs.gitee.io/pics/webp/wallhaven-gp1q87.webp", "https://mlabs.gitee.io/pics/webp/shanshui007sm......
  • CSS3 实现动态旋转加载样式
    CSS3实现动态旋转加载样式要使用CSS3创建一个动态旋转加载样式,你可以使用CSS动画和旋转变换。下面是一个简单的示例:HTML:<divclass="loader"></div>CSS:.loader{width:50px;height:50px;border:4pxsolid#3498db;border-top:4pxsolidtransparent;......
  • qt---主进程加载一个子进程的方法以及其中遇到“Calling a private constructor of cl
    .proQT+=coreguigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsCONFIG+=c++17#YoucanmakeyourcodefailtocompileifitusesdeprecatedAPIs.#Inordertodoso,uncommentthefollowingline.#DEFINES+=QT_DISABLE_DEPRECATED_BEFORE=0......
  • 如何让 WinDebug Preview 加载 Dotnet Core 的 SOS.dll 进行调试
    一、前言最近我在使用WinDebug进行系统调试,也是在学习《Net高级调试》这本书。以前听过WinDebug调试器,但是没有使用过,由于最近想起来了,就好好的研究一下,学习一下。初次接触,还是走了不少弯路,踩了不少坑。关于WinDebug最新版的安装方法,可以在“微软商店”里面,直接查询......
  • Spring Boot Bean的多种加载方式
     在SpringBoot中,您可以以多种方式加载Bean,这取决于项目的需求和设计。以下是一些常见的加载Bean的方式以及相应的示例源代码。1.组件扫描(ComponentScanning)组件扫描是SpringBoot中默认的Bean加载方式,它会自动扫描指定包及其子包,寻找带有@Component及其衍生注......
  • 类加载器
    1.1类加载器作用负责将.class文件(存储的物理文件)加载在到内存中1.2类加载的完整过程类加载时机简单理解:字节码文件什么时候会被加载到内存中?有以下的几种情况:创建类的实例(对象)调用类的类方法访问类或者接口的类变量,或者为该类变量赋值使用反射方式来强制创建某个类或接口对应的java......
  • python tkinter事件循环中一直检测初始化加载文件有没有加载成功
     pythontkinter事件循环中一直检测初始化加载文件有没有加载成功importtkinterastkdefcheck_file_loaded():#检查文件是否加载成功的逻辑iffile_loaded:#文件加载成功,执行相应操作print("文件加载成功")else:#文件未加......
  • Cesium 大量Poi点位数据采用primitiveCluster加载优化
    primitiveCluster.js文件import{BoundingRectangle,Cartesian2,Cartesian3,defaultValue,defined,EllipsoidalOccluder,Event,Matrix4,Billboard,BillboardCollection,Label,LabelCollection,PointPrimitive,PointPrimitiveCollect......