在Android开发中,图片加载已经是必不可少的一部分,无论是新闻类App,购物类、社交类等等,已经不可能不涉及到图片加载。现在的图片加载框架也是很多,我们最熟悉的应该是UIL了,今天就来记录一下Glide的使用。

老规矩,在节目开始之前,我们先来一个搞笑段子:

虽然我不会赚钱,但是我会省钱啊。我早上就看上一辆兰博基尼,我一咬牙、一跺脚,不买!! 
一下子就省了七百多万。。

1、当前比较好的图片加载框架 
Universal Image Loader:使用最广,很强大,但现在官方已停止维护。 
Picasso:和Glide非常像,Square开发的牛逼框架。 
Volley:Google官方出品。 
Fresco:FaceBook出品,数据相当厉害。 
Glide:今天的主角,官方推荐,专注于界面流畅的滚动。

2、简介 
创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。它还可以加载Gif动态图,后面再说。

3、jar包 
https://github.com/bumptech/glide/releases

https://github.com/bumptech/glide/wiki

4、Gradle编译

dependencies {  compile 'com.github.bumptech.glide:glide:3.5.2'  compile 'com.android.support:support-v4:22.0.0'
}
  • 1
  • 2
  • 3
  • 4

5、基本使用

Glide.with(context)  .load("xxxx.png")  .into(imageView);
  • 1
  • 2
  • 3

Glide的代码设计采用现在流行的“流式代码”,方法调用都是一路点点点调用,这个好处就是调用逻辑非常清晰,无论以后某个具体的实现怎么变化,整体的流程都非常清晰,一目了然。

下面分别解释三个函数

6、Glide的with()可以接受的类型有如下:

    Context context;Activity activity;FragmentActivity fragmentActivity;Fragment fragment;
  • 1
  • 2
  • 3
  • 4

相比Picasso只能接受Context要稍微好一点。

7、load()是加载目标资源,可以接受的参数类型有如下:

    Uri uri;String uriString;File file;Integer resourceId;byte[] model;String model;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这么多种加载方式,是不是很方便。

8、into()就是加载资源完成后作什么处理,它接受三种参数:

1)into(ImageView imageView);//显示在控件上。Glide.with(context)  .load("xxxx.png")  .into(imageView);2)into(Target target);//通过回调获得加载结果。Glide.with(context)  .load(url)   .into(new SimpleTarget<Bitmap>(width, height) {  @Override   public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {  }   };3)into(int w, int h);//指定期望的图片大小,返回一个future对象,要在子线程中获取。
new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = Glide.with(context)  .load("xxxx.png")  .into(200, 200).get();}}).start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

into的三种用法区别是什么呢? 
第一种是直接把图片加载出来显示在ImageView上,你并不会得到中间结果,也就是bitmap对象。 
第二种、第三种都是可以获取到bitmap的,获取到后怎么处理自己决定。

第三种需要在子线程中调用。

除了with(),load(),into()三个基本的方法,Glide还有很多使用的Api。

9、设置图片大小 
.override(int w, int h); 
指定加载bitmap的大小,比如原图是500 x 500,into(100, 100),加载出的bitmap就是100 x 100。

10、加载完成动画 
.animate(Animator animator);//或者int animationId 
初次加载出Bitmap时展示的动画,可以是属性动画,也可以是Tween动画。 
**注意:这个动画只在初次加载出来时使用,已经加载过了,下载再从缓存中取是不会动画的。

11、裁剪策略 
.centerCrop() 
裁剪,相当于ImageView设置scaleType为centerCrop,大图的裁剪策略。

12、占位和错误显示 
.placeHolder(int resourceId); 
.error(int resourceId); 
加载时和加载过程中显示的图片,这个图片通常就是本地的一张资源图片,因为它本身就是为了解决加载网络图延迟的手段,自己如果还要从网络获取就不合适了。

13、缓存策略 
.diskCacheStrategy(DiskCacheStrategy.ALL) 
这个是设置缓存策略。 
DiskCacheStrategy.NONE:不缓存 
DiskCacheStrategy.SOURCE:缓存原始图片 
DiskCacheStrategy.RESULT:缓存压缩过的结果图片 
DiskCacheStrategy.ALL:两个都缓存

14、加载gif动态图 
.asBitmap() 
.asGif() 
只需要加一行代码,Glide就可以直接在ImageView上加载gif动态图,这个还是很方便的。

Glide.with(context).load("xxx.gif").asGif().into(imageView);
  • 1
  • 2
  • 3
  • 4

关键就是asGif()这行代码,它就会自动加载成gif动态图,如果改成asBitmap(),就是静态图。

15、图片转换transform 
.tranform(Tranformation tranformation) 
Tranformation:转换,用于对bitmap进行转换。 
官方解释:所设置的转换方式会应用在每一帧图片或者是gif图片的每一个bitmap

比如我们要用Glide加载出圆角图片,或者是圆形图片,就要用到Transformation。 

具体的方法就是写一个类继承BitmapTransformation,然后重写transform()方法。

<圆角图片>

public class GlideRoundTransform extends BitmapTransformation {public static final int DEFAULT_CORNER_RADIO = 10;private static float radius = 0f;public GlideRoundTransform(Context context) {this(context, DEFAULT_CORNER_RADIO);}public GlideRoundTransform(Context context, int dp) {super(context);this.radius = Resources.getSystem().getDisplayMetrics().density * dp;}@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {return roundCrop(pool, toTransform);}private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {if (source == null) return null;Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);if (result == null) {result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);}Canvas canvas = new Canvas(result); Paint paint = new Paint();        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));        paint.setAntiAlias(true);        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());        canvas.drawRoundRect(rectF, radius, radius, paint);        return result;    }    @Override public String getId() {        return getClass().getName() + Math.round(radius);    }}

圆形图片public class GlideCircleTransform extends BitmapTransformation {    public GlideCircleTransform(Context context) {        super(context);    }    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {        return circleCrop(pool, toTransform);    }    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {        if (source == null) return null;        int size = Math.min(source.getWidth(), source.getHeight());        int x = (source.getWidth() - size) / 2;        int y = (source.getHeight() - size) / 2;        // TODO this could be acquired from the pool too        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);        if (result == null) {            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);        }        Canvas canvas = new Canvas(result);        Paint paint = new Paint();        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));        paint.setAntiAlias(true);        float r = size / 2f;        canvas.drawCircle(r, r, r, paint);        return result;    }    @Override public String getId() {        return getClass().getName();    }}



16、移除当前Transformation .dontTransform()17、移除所有的动画 .dontAnimate()18、跳过内存缓存 .skipMemoryCache(true)19、色彩模式 Glide 在默认的 RGB_565 格式下加载的图片质量可以接受的话,可以什么都不做。但如果你觉得难以接受,或者是你的实际需求对图片的质量有更高的要求的话,你可以像下面的代码那样创建一个 GlideModule 子类,把 Bitmap 的格式转换到 ARGB_8888:
public class GlideConfiguration implements GlideModule {  @Override  public void applyOptions(Context context, GlideBuilder builder) {  builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);  }  @Override  public void registerComponents(Context context, Glide glide) {  }
}//manifest
<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/>
20、暂停\回复请求 Glide.with(context).resumeRequests(); Glide.with(context).pauseRequests(); 当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。21、清空请求列表 Glide.clear()22、下载图片,并且获取下载路径
new Thread(new Runnable() {@Overridepublic void run() {try {Future<File> fu = Glide.with(MainActivity.this).load("https://www.baidu.com/img/bdlogo.png").downloadOnly(200, 200);File file = file;Log.e("TAG", "## path=" + file.getAbsoluteFile());FileInputStream fis = new FileInputStream(file);byte[] data = new byte[fis.available()];fis.read(data, 0, fis.available());fis.close();Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//do something...} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}).start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意:必须是在子线程中使用

注意: 本人在使用该框架时候遇到一个问题,请看到这篇文章的指导下:

问题描述: imageView正在使用该框架播放GIF动画,然后这个时候我怎么隐藏该imagview(测试调用imageview不起作用,然后Glide.clrear(Imageview)可以起到作用,但网上回复又说其实还是在的,只是没显示出来,现在的问题是,该怎么实现该隐藏功能? 谢谢指导)

Android图片加载Glide框架使用详解相关推荐

  1. Android 图片加载开源框架Fresco,基于各种使用场景的讲解

    Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理 ...

  2. android系统加载主题的流程,详解Android布局加载流程源码

    一.首先看布局层次 看这么几张图 我们会发现DecorView里面包裹的内容可能会随着不同的情况而变化,但是在Decor之前的层次关系都是固定的.即Activity包裹PhoneWindow,Phon ...

  3. android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...

    前言Glide,该功能非常强大 Android  图片加载开源框架 相信大家并不陌生 正由于他的功能强大,所以它的源码非常复杂,这导致很多人望而却步 本人尝试将 Glide 的功能进行分解,并单独针对 ...

  4. Android图片加载框架

    这篇文章主要和大家一起动手编写Android图片加载框架,从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,感兴趣的小伙伴们可以参考一下 开发一个简洁而实用的And ...

  5. Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

    本文转载自郭神的Glide分析系列:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二 ...

  6. Android图片加载框架 Glide 4 的用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  7. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  8. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78357251 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  9. Android图片加载框架最全解析(三),深入探究Glide的缓存机制

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/54895665 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. Python中的反射机制(reflect)
  2. 高级数据结构实现——自顶向下伸展树
  3. 计算机的四个硬盘有什么区别是什么意思,笔记本的内存和硬盘有什么区别 原来笔记本硬盘有这几种...
  4. linux/windows上STM32固件烧写工具的开发demo
  5. 长春南关区净月大街附近都有哪些课后班?
  6. java 方法 示例_Java语言环境getDisplayVariant()方法与示例
  7. 发现1个宝藏项目,GitHub上都没有的那种!
  8. 动与静--软件的雕塑艺术
  9. 更改vmware esx机器的ip
  10. MathType 的使用
  11. xilinx提供测试dma和fft在sdk端的代码
  12. (转)使用Xtrabackup备份MySQL数据库(续)
  13. 2.Dockerfile
  14. python字符串转成数组_python将字符串转换成数组的方法
  15. 单总线led驱动芯片WS2811在linux下的驱动
  16. 运用现代信息技术 推进环评大数据建设
  17. 高中知识三角函数怎么计算机,高中三角函数怎么学 有什么方法
  18. 电脑进入pe时蓝屏_进入PE系统也会蓝屏?运行PE系统蓝屏原因及解决方法
  19. 王权小福贵儿的Java学习笔记
  20. 渗透扫描工具Nmap下载、安装和使用

热门文章

  1. 能不能不经妻子同意,就把和妻子共有的房子抵押给银行用来贷款 ?
  2. 什么是GDP平减指数
  3. 移除百度地图LOGO和版权信息
  4. SX1302官方开源代码无法在NUC980主控芯片中使用SPI片选脚
  5. 微软认证BI专家雷元带你全面搞定Power BI数据分析
  6. javaBean简介及基本使用————魔乐
  7. JavaScript第4章简答题5(创建一个构造函数Animal,使用继承完成如下要求:)
  8. python学习笔记:泊松分布和负指数分布随机数的python实现
  9. [转载] 蒲慕明教授的eMail
  10. VS终结者原理及思路简要说明