前言最近项目中有使用到gif动画加上本身已经引入了Glide 支持gif库所以便用Glide来加载了但在使用过程中还是遇到了不少困难 在此记录下希望可以给遇到类似问题的你一些思考和建议。一、Glide加载gif1.在项目中添加依赖dependencies{compilecom.github.bumptech.glide:glide:4.0.0compilecom.android.support:support-v4:25.3.1}Glide需要依赖Support Library v42.加载图片// For a simple view:OverridepublicvoidonCreate(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:OverridepublicViewgetView(int position,View recycled,ViewGroup container){final ImageView myImageView;if(recyclednull){myImageView(ImageView)inflater.inflate(R.layout.my_image_view,container,false);}else{myImageView(ImageView)recycled;}String urlmyUrls.get(position);Glide.with(myFragment).load(url).centerCrop().placeholder(R.drawable.loading_spinner).into(myImageView);returnmyImageView;}//不使用它的默认动画Glide.with(mContext).load(url).dontAnimate().placeholder(R.drawable.loading_spinner).into(circleImageview);提示不要再非主线程里面使用Glide加载图片如果真的使用了请把context参数换成getApplicationContext3.加载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丢进去就行了mVideoFilenewFile(Environment.getExternalStorageDirectory(),xiayu.mp4);Glide.with(this).load(mVideoFile).placeholder(R.mipmap.place).error(R.mipmap.icon_photo_error).into(mIv);在大多数情况下当你使用diskCacheStrategyDiskCacheStrategy.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(newGlideDrawableImageViewTarget(iv,1));这里的GlideDrawableImageViewTarget(ImageView view, int maxLoopCount)这个方法maxloopCount可以控制显示次数。二、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(newGlideDrawableImageViewTarget(imageView,1));4.GIF 时间Glide.with(FirstActivity.this).load(file).asGif().fitCenter().diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(newRequestListenerFile,GifDrawable(){OverridepublicbooleanonException(Exception e,File model,TargetGifDrawabletarget,boolean isFirstResource){returnfalse;}OverridepublicbooleanonResourceReady(final GifDrawable resource,File model,TargetGifDrawabletarget,boolean isFromMemoryCache,boolean isFirstResource){newThread(newRunnable(){Overridepublicvoidrun(){int duration0;try{GifDrawable gifDrawable(GifDrawable)resource;GifDecoder decodergifDrawable.getDecoder();for(int i0;igifDrawable.getFrameCount();i){durationdecoder.getDelay(i);}mGifAdTimeduration;}catch(Throwable e){}}}).start();returnfalse;}}).into(mAdImg);更多Android进阶指南 可以扫码 解锁《Android十大板块文档》1.Android车载应用开发系统学习指南附项目实战2.Android Framework学习指南助力成为系统级开发高手3.2023最新Android中高级面试题汇总解析告别零offer4.企业级Android音视频开发学习路线项目实战附源码5.Android Jetpack从入门到精通构建高质量UI界面6.Flutter技术解析与实战跨平台首要之选7.Kotlin从入门到实战全方面提升架构基础8.高级Android插件化与组件化含实战教程和源码9.Android 性能优化实战360°全方面性能调优10.Android零基础入门到精通高手进阶之路敲代码不易关注一下吧。ღ( ´ᴗ )