Glide的用法
最基本用法
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 );}
注意事项:
- 上面这段代码不要写成匿名内部类的机制,原因就是java的自动垃圾回收机制可能在图片还没有加载好的时候就已经把你的Target回收了。
- 注意.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的用法的更多相关文章
- Android 图片加载框架 Glide 的用法
https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...
- 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法
使用Android Glide,需要先下载Android Glide的库,Android Glide在github上的项目主页: https://github.com/bumptech/glide . ...
- Android图片加载框架最全解析(一),Glide的基本用法
现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有 ...
- Android框架之Volley与Glide
PS:在看到这个题目的同时,你们估计会想,Volley与Glide怎么拿来一块说呢,他们虽然不是一个框架,但有着相同功能,那就是图片处理方面.首先我们先来看一下什么volley,又什么是glide. ...
- Android图片加载为什么选择glide
为什么图片加载我首先Glide 图片加载框架用了不少,从afinal框架的afinalBitmap,Xutils的BitmapUtils,老牌框架universalImageLoader,著名开源组织 ...
- Fresco,Glide,Picasso
1.Picasso和Glide的with后面的参数不同 Picasso.with(这里只能传入上下文) . Glide.with,后面可以传入上下文,Application实例,Activit ...
- android Glide简单使用
版权声明:大家可以转载,请写明转载申明 https://blog.csdn.net/bzlj2912009596/article/details/81702367 今天,简单讲讲Android里Gli ...
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
不知不觉中,我们的Glide系列教程已经到了第六篇了,距离第一篇Glide的基本用法发布已经过去了半年的时间.在这半年中,我们通过用法讲解和源码分析配合学习的方式,将Glide的方方面面都研究了个遍, ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
随机推荐
- linux常见命令整理
Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touc ...
- (连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Codeforces777A Shell Game 2017-05-04 17:11 59人阅读 评论(0) 收藏
A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...
- D3_book 7 area
<!-- area的例子csv使用node.js提供的 --> <!DOCTYPE html> <meta charset="utf-8"> & ...
- LeetCode146:LRU Cache
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- Angular6 学习笔记——组件详解之组件通讯
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- Windows10 家庭版添加【本地组策略编辑器】
Windows10 家庭版默认没有[本地组策略编辑器],添加方法: 新建记事本复制以下内容 @echo off pushd "%~dp0" dir /b C:\Windows\se ...
- XCode - 无法对iPhone真机调试的解决方法!
OSX:10.14 XCode:10.1 真机:iPhone 4S 错误很多啊,并非编译错误,编译已经成功了,但是无法安装到真机,我真不理解啊!!由于真的没有想到能够解决,有的错误没有截图,先看部分错 ...
- LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)
题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ...
- java实现简单扫雷游戏
/** * 一个简单的扫雷游戏 MainFram.java */ package www.waston; import java.awt.BorderLayout; import java.awt.C ...