最基本用法

glide采用的都是流接口方式

简单的从网络加载图片

Glide.with(context).load(internetUrl).into(targetImageView);

从文件加载

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);

从资源id

int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);

从uri

Glide.with(context).load(uri).into(imageViewUri);

加载gif

String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );

一些常规方法(待加载时显示,加载出错时显示)

Glide.with( context ).load( gifUrl ).placeholder( R.drawable.cupcake ).error( R.drawable.full_cake ).into( imageViewGif );

强制转化为gif

Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );

用bitMap播放Gif

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

播放本地mp4,只能是本地

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( **new **File( filePath ) ) ).into( imageViewGifAsBitmap );

进一步

RecyclerView的结合(同样适用于ListView,GridView等)

在上面这些等价ScrollView中,Glide会自动的请求取消,清楚ImageView,在合适的ImageView中加载合适的Image.当需要裁剪大小时,有个*.centerCrop*方法,这个方法的裁剪会让你的ImageView周围不会留白,还有一个.fitCenter()方法,表示让你的Image完全显示,尺寸不对时,周围会留白。这里有惊喜,圆ImageView

等会儿补充

Glide的缓存

用过手机的都知道,当划上划下一个ListView的时候,第二次都比第一次快,就是因为为GlideView对资源进行了缓存,而且封装的很好,甚至不需要自己去设定缓存大小,Glide会智能地自己给我们根据设备设置缓存大小。

placeHolder

听名字都知道这家伙是干嘛的,加载图片,但是图片还没有加载完的时候,总不能给用户看空白吧,这个就是用来填充着一段是时间的。

Glide.with(context).
load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) *// 同样也可以是drawble
.into(imageViewPlaceholder);

这里只能用本地资源,不能用网络资源,因为网络资源也有可能加载不出来。

当加载出错,或者加载不出来的时候.error()方法来帮忙

其实大多数时候用placeHolder就可以了。

Glide.with(context)
.load("http://futurestud.io/non_existing_image.png")
.placeholder(R.mipmap.ic_launcher) // 同样也可以是drawble
.error(R.mipmap.future_studio_launcher)// 当不能加载时载入

.fallback

除了上面两种‘异常情况’,还有一种情形就是打开手机的通讯录的时候,可以看到你给有些喜欢的人设置了照片,然而有些可怜的人并没给有,总不能在那里留下一片空白吧,这个时候相当于传递了Null,传递null时,这个callback方法就会被调用,推荐在这里给我设置一张吴彦祖或者小贝的照片。嗯。。(QAQ)

Glide.with(context)
.load( null)//加载空指针的时候
.fallback( R.drawable.wuyanzu)//嗯,吴彦祖。
.into( imageViewNoFade );

加点动画

嗯,其实这个是默认的,但是你还是可以写出来,渐显动画

Glide.with(context)
.load().placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.future_studio_launcher)
.crossFade()
.into(imageViewFade);

这里还有一个.fadeFade(int duration),设置动画时间。如果你不想要动画可以加上.dontAnimate()

调整图片大小.resize(int ,int )

单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你mageView裁剪照片来放在缓存中了。但是不想适应ImageView大小的时候,可以调用这个方法.override()

Glide.with(context)
.load(image)
.override(600, 200)
.into(imageViewResize);

裁剪图片

就是上名讲的.fitCenter.CenterCrop

来点缩略图

缩略图有什么用就不说了,方正在一些条件下好处大大的,相当于一个动态的placeHolder。还有一种方法
.thumbnail()方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。

Glide.
with( context )
.load(image)
.thumbnail( 0.1f )//表示为原图的十分之一
.into( imageView2 );

一种更高级的缩略图加载方式

当缩略图也需要通过网络加载全部解析度的时候。

private void loadImageThumbnailRequest() {
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( eatFoodyImages[2] );
Glide.with( context ).load( UsageExampleGifAndVideos.gifUrl ).thumbnail( thumbnailRequest ).into( imageView3 );
}

关于缓存

要想性能好,怎可以不用缓存。缓存就是为了减少或者杜绝多的网络请求。为了避免缓存,Glide用了内存缓存和‘外存缓存机制’,并且 提供了相应的方法,完全封装,不需要处理细节。Glide会自动缓存到内存,除非调用. skipMemoryCache( true )。尽管调用了这个,Glide还是会缓存到外存,还有一种情形,就是有一张图片,但是这张图变化非常快,这个时候可能并不想缓存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。如果你两种都不需要,可以两个方法组合着一起使用。

自定义外存缓存机制

Glide默认会缓存Image的很多个版本,比如原图,如果你的imageView大小的缓存。.diskCacheStrategy( )有以下几种缓存策略:

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 只缓存最高解析图的image
  • DiskCacheStrategy.RESULT 缓存最后一次那个image,比如有可能你对image做了转化
  • DiskCacheStrategy.ALL image的所有版本都会缓存
Glide
.with( context ).load( image )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );

请求优先级.request()

加载图片肯定也是有先后顺序,Glide提供了.request()这个方法,它接收以下几个参数:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE
    但是Glide并不一定会按照你的顺序来,只是尽量按照你的顺序来。(比如给一张很大的图片最高的优先权,但是它并不一定比低优先级的图先加载出来,这个时候只有使用缩略图了)

利用callback在非标准情况下加载图片

上名所有的情况都是加载图片到ImageView中,但是并不是所有的情况都是这样。

Glide中的回调:Targets

从上面的介绍,已经可以看出Glide内部封装了所有的细节,什么网络请求,什么缓存机制,当所有都就绪过后,自动切换回UI线程,更新ImageView。Targets就是Glide中的回调,当异步线程中所有的工作做完过后返回结果。说白了就是,当请求图片完成后,需要回调的方法。

SimplerTarget
private SimpleTarget target = new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
// do something with the bitmap
// for demonstration purposes, let's just set it to an ImageView
imageView1.setImageBitmap( bitmap );
}
};
private void loadImageSimpleTarget() {
Glide.with( context ) *// could be an issue!*
.load( eatFoodyImages[0] )
.asBitmap()//强制Glide返回一个Bitmap
.into( target );}

注意事项:

  1. 上面这段代码不要写成匿名内部类的机制,原因就是java的自动垃圾回收机制可能在图片还没有加载好的时候就已经把你的Target回收了。
  2. 注意.with()里面的参数,Glide的请求是和传进去的Context共存亡的,如果传一个Activity进去,当Activity GG过后,你的请求也就GG了,但是如果这样传:.with(context.getApplicationContext() ).当你的Activity GG过后,请求还是会继续,回调还是会继续。
有size的Target

如果传给.into()的是一个ImageView,但是图片的size比ImageView的Size打,Glide为了节省时间,会加载小的那个size的Image。但是这对Target并不适用,以为这里并不知道SIze。但是如果知道image应该多大,可以传递给Target.就像下面这样:

private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {imageView2.setImageBitmap( bitmap );
}
};
private void loadImageSimpleTargetApplicationContext() {
Glide.with( context.getApplicationContext() ) *// safer!*
.load( eatFoodyImages[1] )
.asBitmap()
.into( target2 );
}
ViewTarget

适用于想Glide加载到自定义View中去,

public class FutureStudioView extends FrameLayout {
ImageView iv;
TextView tv;
public void nitialize(Context context) {
inflate( context, R.layout.custom_view_futurestudio, this );
iv = (ImageView) findViewById( R.id.custom_view_image );
tv = (TextView) findViewById( R.id.custom_view_text );
}
public FutureStudioView(Context context, AttributeSet attrs) {
super( context, attrs );
initialize( context );
}
public FutureStudioView(Context context,AttributeSet attrs,int defStyleAttr) {
super( context, attrs, defStyleAttr );
initialize( context );
}
public void setImage(Drawable drawable) {
iv = (ImageView) findViewById( R.id.custom_view_image );
iv.setImageDrawable( drawable );
}}
notificationTarget 和AppWidget中的使用

这个下一篇再补充,有点点复杂。

作者:lxacoder
链接:https://www.jianshu.com/p/c9efd313e79e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Glide的用法的更多相关文章

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

    https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...

  2. 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法

    使用Android Glide,需要先下载Android Glide的库,Android Glide在github上的项目主页: https://github.com/bumptech/glide . ...

  3. Android图片加载框架最全解析(一),Glide的基本用法

    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有 ...

  4. Android框架之Volley与Glide

    PS:在看到这个题目的同时,你们估计会想,Volley与Glide怎么拿来一块说呢,他们虽然不是一个框架,但有着相同功能,那就是图片处理方面.首先我们先来看一下什么volley,又什么是glide. ...

  5. Android图片加载为什么选择glide

    为什么图片加载我首先Glide 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织 ...

  6. Fresco,Glide,Picasso

    1.Picasso和Glide的with后面的参数不同 Picasso.with(这里只能传入上下文)     . Glide.with,后面可以传入上下文,Application实例,Activit ...

  7. android Glide简单使用

    版权声明:大家可以转载,请写明转载申明 https://blog.csdn.net/bzlj2912009596/article/details/81702367 今天,简单讲讲Android里Gli ...

  8. Android图片加载框架最全解析(六),探究Glide的自定义模块功能

    不知不觉中,我们的Glide系列教程已经到了第六篇了,距离第一篇Glide的基本用法发布已经过去了半年的时间.在这半年中,我们通过用法讲解和源码分析配合学习的方式,将Glide的方方面面都研究了个遍, ...

  9. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

随机推荐

  1. MapGIS Mobile开发

    1. 先将Android开发环境配置好(包括Java + Eclipse + Android SDK) 2. 加载API类库(运行MapGIS 10 AndroidSDK.exe可以加载Mobile框 ...

  2. MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案

    第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库 ...

  3. SBIT

    SBIT chmod -R o+t dirs/ 给指定目录设置保护,只有所有者才能删除.

  4. IOS11下fixed中input光标错位问题

    项目遇到了这个问题,故作了个临时解决方案,暂时没有想到更好的方法,查阅了网上的方案,也没有找到完美的解决方案. 方案思路: ①弹窗打开时,阻止 body 滚动,禁用 touchmove ,同时记录当前 ...

  5. linux cpu过高原因及代码定位

    1. top命令查看CPU和内存占用率 top回车,然后按1 发现进程PID 35163 CPU和内存占用率都很高 top - 06:13:47 up  5:31,  1 user,  load av ...

  6. genymotion无法连接相机问题

    genymotion模拟器即时打开了相机的开关,也无法连接到相机.这是因为其他进程占用了相机,虚拟设备无法获得,可以尝试: 1.不关闭模拟器,重启adt的Eclipse 2.重启ADB,adb kil ...

  7. hdu 4998 矩阵表示旋转

    http://acm.hdu.edu.cn/showproblem.php?pid=4998 http://blog.csdn.net/wcyoot/article/details/33310329 ...

  8. [译]在 Andriod/IOS 程序中使用自己的字体

    原文链接:http://firemonkeyblog.blogspot.com/2014/12/using-custom-fonts-in-android-delphi.html 你应该能够在 And ...

  9. oracle只导出触发器

    只要触发器,其他都不要 方法1:plsql develop调用exp:tools->export object—>trigger 方法2:select dbms_metadata.get_ ...

  10. 集体智慧编程-discovering groups

    这一章讲的是利用聚集算法对blog进行分类. 首先是构造数据,找到一组blog,每个blog包含一组单词.这样就形成了(blog-name, word*)*的数据结构. 在构造该数据结构的过程中,还需 ...