Android人类开发利用海洋Glide用过的人多吗

Android图片加载框架Glide - 前人挖坑,后人种(pen) - CSDN博客
Android图片加载框架Glide
http://blog.csdn.net/kai_1215/article/details/
1.使用Glide结合列表的样式进行图片加载:
&(1)如果使用的是ListView,可以直接在Adapter的getView方法中使用:&
&&& &&& &&&&
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
Glide.with(context).load(imageUrls[position]).into(holder.imageView);
return convertV
(2)如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用:
& & public void onBindViewHolder(RVViewHolder holder, int position) {
& & & & Glide.with(MainActivity.this)
& & & & & & & & .load(args[position])
& & & & & & & & .into(holder.imageView);
(3)&当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法:
Glide.with(context).load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into(imageViewPlaceholder);
(4)&当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:
Glide.with(context).load(&http://futurestud.io/non_existing_image.png&)
.error(R.mipmap.future_studio_launcher)
.into(imageViewError);
(5)&图片的缩放,centerCrop()和fitCenter():
// 使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的&Height是match_parent则图片就会被拉伸填充
Glide.with(MainActivity.this).load(args[position]).centerCrop()
.into(holder.imageView);
// 使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围该图像将会完全显示,但可能不会填满整个 ImageView。
Glide.with(MainActivity.this).load(args[position]).fitCenter()
.into(holder.imageView);
(6)显示gif动画:
Glide.with(context).load(gifUrl).asGif() // 判断加载的url资源是否为gif格式的资源
.error(R.drawable.full_cake).into(imageViewGif);
(7)显示本地视:
String filePath = &/storage/emulated/0/Pictures/example_video.mp4&;
Glide.with(context).load(Uri.fromFile(new File(filePath)))
.into(imageViewGifAsBitmap);
(8)缓存策略:
& &.with( context )
& &.load( Images[0] )
& &.skipMemoryCache( true ) //跳过内存缓存
& &.into( imageViewInternet );
Glide.with(context).load(images[0])
.diskCacheStrategy(DiskCacheStrategy.NONE) // 跳过硬盘缓存
.into(imageViewInternet);
DiskCacheStrategy.NONE&什么都不缓存DiskCacheStrategy.SOURCE&仅仅只缓存原来的全分辨率的图像DiskCacheStrategy.RESULT&仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)DiskCacheStrategy.ALL&缓存所有版本的图像(默认行为)
&(9)&优先级,设置图片加载的顺序:
Priority.LOWPriority.NORMALPriority.HIGHPriority.IMMEDIATE&&
private void loadImageWithHighPriority() {
Glide.with(context).load(mages[0]).priority(Priority.HIGH)
.into(imageViewHero);
private void loadImagesWithLowPriority() {
Glide.with(context).load(images[1]).priority(Priority.LOW)
.into(imageViewLowPrioLeft);
Glide.with(context).load(images[2]).priority(Priority.LOW)
.into(imageViewLowPrioRight);
&(10)&当不需要将加载的资源直接放入到ImageView中而是想获取资源的Bitmap对象:
//括号中的300,600代表宽和高但是未有作用
SimpleTarget target = new SimpleTarget&Bitmap&(300,600) {
& & & & & & & &@Override
& & & & & & & &public void onResourceReady(Bitmap resource, GlideAnimation&? super Bitmap&glideAnimation) {
& & & & & & & & & &holder.imageView.setImageBitmap(resource);
& & & & & & & &}
& & & & & &};
& & & & & &Glide.with(MainActivity.this)
& & & & & & & & & &.load(args[position])
& & & & & & & & & &.asBitmap()
& & & & & & & & & &.into(target);
&(11)集成网络栈(okHttp,Volley):&&
dependencies { &
& &// your other dependencies
& &// Glide
& &compile 'com.github.bumptech.glide:glide:3.6.1'
& &// Glide's OkHttp Integration&
& &compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar'
& &compile 'com.squareup.okhttp:okhttp:2.5.0'
dependencies { &
& &// your other dependencies
& &// Glide
& &compile 'com.github.bumptech.glide:glide:3.6.1'
& &// Glide's Volley Integration&
& &compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
& &compile 'com.mcxiaoke.volley:library:1.0.8'
http://blog.csdn.net/theone/article/details/
在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫&&的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。
毫无疑问,这个库引起了我的兴趣。于是我花了一个晚上研究和把玩它,将它的实现原理分析清楚以后,我决定写一篇博文分享一些自己的经验。在开始之前我想说,Glide和Picasso有90%的相似度,准确的说,我觉得它就像 Picasso 的克隆体。
不管怎样,Glide 和 Picasso在细节上还是有不少区别的,接下来我会让你们了解到其中的差异。
Picasso和Glide都在jcenter上。在项目中添加依赖非常简单: Picasso
dependencies {
compile 'com.squareup.picasso:picasso:2.5.1'
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
不管怎样,Glide 需要&&Support Library v4 包,千万不要忘了像上面的代码做的那样添加 Android Support
Library v4 包的依赖。不过这都不是什么大问题,因为现在 Android Support Library v4 基本是每一个新 Android 项目的标配了。
就如我所说的Glide和Picasso非常相似,Glide加载图片的方法和Picasso如出一辙。
Picasso.with(context)
.load(&http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg&)
.into(ivImg);
Glide.with(context)
.load(&http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg&)
.into(ivImg);
虽然两者看起来非常相似,但是 Glide 的代码无疑设计得更好,因为 Glide 的 with() 方法不光接受 Context,还接受 Activity 和 Fragment。此外,with() 方法还能自动地从你放入的各种东西里面提取出 Context,供它自己使用。
同 时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如 Paused状态在暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity 和 Fragment给Glide,而不是Context。
默认Bitmap格式是RGB_565
下面是加载图片时和Picasso的比较( 像素的图片加载到768x432的ImageView中)
可以看到Glide加载的图片质量要差于Picasso(ps:我看不出来哈),为什么?这是因为Glide默认的Bitmap格式是RGB_565 ,比ARGB_;式的内存开销要小一半。下面是Picasso在ARGB8888下与Glide在RGB565下的内存开销图(应用自身占用了8m,因此以8为基准线比较):
如果你觉得 Glide 在默认的 RGB_565 格式下加载的图片质量可以接受的话,可以什么都不做。但如果你觉得难以接受,或者是你的实际需求对图片的质量有更高的要求的话,你可以像下面的代码那样创建一个 GlideModule 子类,把 Bitmap 的格式转换到 ARGB_8888:
public class GlideConfiguration implements GlideModule {
public void applyOptions(Context context, GlideBuilder builder) {
// Apply options to the builder here.
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
public void registerComponents(Context context, Glide glide) {
// register ModelLoaders here.
然后在AndroidManifest.xml中将GlideModule定义为meta-data
&meta-data android:name=&com.inthecheesefactory.lab.glidepicasso.GlideConfiguration&
android:value=&GlideModule&/&
这样看起来就会好很多。
我们再来看看内存开销图,虽然看起来这次 Glide 的内存开销接近于上次的两倍,但是Picasso的内存开销仍然远大于Glide。
但是上面那样做的问题在于你需要手动计算 ImageView 的尺寸,又或者是你对 ImageView 设置了具体的尺寸大小,为了解决这样的麻烦,你可以在 Picasso 中通过这样做简化你的代码:
Picasso.with(this)
.load(&http://nuuneoi.com/uploads/source/playstore/cover.jpg&)
.resize(768, 432)
.into(ivImgPicasso);
但是问题在于你需要主动计算ImageView的大小,或者说你的ImageView大小是具体的值(而不是wrap_content),你也可以这样:
Picasso.with(this)
.load(&http://nuuneoi.com/uploads/source/playstore/cover.jpg&)
.centerCrop()
.into(ivImgPicasso);
现在Picasso的内存开销就和Glide差不多了。
虽然内存开销差距不大,但是在这个问题上Glide完胜Picasso。因为Glide可以自动计算出任意情况下的ImageView大小。
Image质量的细节
这是将ImageView还原到真实大小时的比较。&
很显然,Glide 加载的图片有些像素点变得很模糊,看起来也没有 Picasso 那么平滑。而且直到现在,我也没有找到一个可以直观改变图片大小调整算法的方法。
但是这并不算什么坏事,因为很难察觉。
Picasso和Glide在磁盘缓存策略上有很大的不同。我们刚刚做了一个使用 Glide 和 Picasso 加载同一张高清图片的实验,我在实验后检查缓存目录时发现: Glide 缓存的图片和 ImageView 的尺寸相同,而 Picasso 缓存的图片和原始图片的尺寸相同。
上面提到的平滑度的问题依然存在,而且如果加载的是RGB565图片,那么缓存中的图片也是RGB565。
我 尝试将ImageView调整成不同大小,但不管大小如何Picasso只缓存一个全尺寸的。Glide则不同,它会为每种大小的ImageView缓存 一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。
具体说来就是:假如在第一个页面有一个200x200的ImageView,在第二个页面有一个100x100的ImageView,这两个ImageView本来是要显示同一张图片,却需要下载两次。
不过,你可以改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸:
Glide.with(this)
.load(&http://nuuneoi.com/uploads/source/playstore/cover.jpg&)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,即便你添加了这段代码来让其立即显示:
.noFade();
Picasso 和 Glide 在磁盘缓存策略上各有所长,你应该根据自己的需求选择最合适的。
对我而言,我更喜欢Glide,因为它远比Picasso快,虽然需要更大的空间来缓存。
你可以做到几乎和Picasso一样多的事情,代码也几乎一样。
Image Resizing
// Picasso
.resize(300, 200);
.override(300, 200);
Center Cropping
// Picasso
.centerCrop();
.centerCrop();
Transforming
// Picasso
.transform(new CircleTransform())
.transform(new CircleTransform(context))
设置占位图或者加载错误图:
// Picasso
.placeholder(R.drawable.placeholder)
.error(R.drawable.imagenotfound)
.placeholder(R.drawable.placeholder)
.error(R.drawable.imagenotfound)
正如我在博文开头所说,如果你已经熟悉如何使用 Picasso,那从Picasso转换到Glide对你来说就是小菜一碟。
有什么Glide可以做而Picasso
Glide可以加载GIF动态图,而Picasso不能。
同时因为Glide和Activity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide 的缓存在gif这里也是一样,调整大小然后缓存。
但是从我的一次测试结果来看,用 Glide 显示动画会消耗很多内存,因此谨慎使用。
除了gif动画之外,Glide还可以将任意本地视频解码成一张静态图片。
还有一个特性是你可以配置图片显示的动画,而Picasso只有一种动画:fading in。
最后一个是可以使用thumbnail()产生一个你所加载图片的thumbnail。
其实还有一些特性,不过不是非常重要,比如将图像转换成字节数组等。 配置
有许多可以配置的选项,比如大小,缓存的磁盘位置,最大缓存空间,位图格式等等。可以在这个页面查看这些配置 Configuration 。
Picasso (v2.5.1)的大小约118kb,而Glide (v3.5.2)的大小约430kb。
不过312kb的差距并不是很重要。
Picasso和Glide的方法个数分别是840和2678个。
必须指出,对于DEX文件65535个方法的限制来说,2678是一个相当大的数字了。建议在使用Glide的时候开启ProGuard。
Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高。你更喜欢哪个呢?
虽然我使用了很长时间的Picasso,但是我得承认现在我更喜欢Glide。我的建议是使用Glide,但是将Bitmap格式换成 ARGB_8888、让Glide缓存同时缓存全尺寸和改变尺寸两种。
相关文章推荐在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫&&的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。
它的成功让我非常感兴趣。我花了一整晚的时间把玩,决定分享一些自己的经验。在开始之前我想说,Glide和Picasso有90%的相似度,准确的说,就是Picasso的克隆版本。但是在细节上还是有不少区别的。
Picasso和Glide都在jcenter上。在项目中添加依赖非常简单:
dependencies {
compile 'com.squareup.picasso:picasso:2.5.1'
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
当然现在v4包已经是android项目标配了
Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。
1.网络加载图片到ImageView中
Glide.with(context).load(imageUrl).into(imageView);
2.当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法
Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView);
3.当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:
Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView);
4.图片的缩放,centerCrop()和fitCenter(): 1)使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的Height是match_parent则图片就会被拉伸填充
Glide.with(context).load(imageUrl).centerCrop().into(imageView);
2)使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围,该图像将会完全显示,但可能不会填满整个ImageView。
Glide.with(context).load(imageUrl).fitCenter().into(imageView);
5.显示gif动画,asGif()判断是否是gif动画
Glide.with(context).load(imageUrl).asGif().into(imageView);
6.显示本地视频
String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(imageViewGifAsBitmap );
7.缓存策略
Glide.with( context ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳过内存缓存
Glide.with( context ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳过硬盘缓存
DiskCacheStrategy.NONE&什么都不缓存
DiskCacheStrategy.SOURCE&仅仅只缓存原来的全分辨率的图像
DiskCacheStrategy.RESULT&仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
DiskCacheStrategy.ALL&缓存所有版本的图像(默认行为)
8.优先级,设置图片加载的顺序:
Glide.with(context).load(imageUrl).priority( Priority.HIGH).into( imageView);
9.获取Bitmap,设置CircleImageVIew可以使用这个
Glide.with(mContext)
.load(url)
.placeholder(R.drawable.loading_spinner)
.into(new SimpleTarget&Bitmap&(width, height) {
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
// setImageBitmap(bitmap) on CircleImageView
10.加载圆形图片和圆角图片
//圆形图片
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);
@Override public String getId() {
return getClass().getName();
Contact GitHub API Training Shop Blog About
//圆角图片
public class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 4);
public GlideRoundTransform(Context context, int dp) {
super(context);
this.radius = Resources.getSystem().getDisplayMetrics().density *
@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);
@Override public String getId() {
return getClass().getName() + Math.round(radius);
Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context)).into(imageView);
Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context, 10)).into(imageView);
Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(new GlideCircleTransform(context)).into(imageView);
一些使用技巧
1.Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()
当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?
2.Glide.clear()
当你想清除掉所有的图片加载请求时,这个方法可以帮助到你。
3.ListPreloader
如果你想让列表预加载的话,不妨试一下ListPreloader这个类。
一些基于Glide的优秀库
一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果,赞的不行不行的~~
一个可以在Glide加载时很方便使用Palette的库。
阅读(...) 评论()Android开发Glide用过的人多吗_百度知道
Android开发Glide用过的人多吗
我有更好的答案
在eclipse中一个依赖库就叫一个library 使用android提供的v7包在Android studio中依赖库已经叫Module了,其实就是一个library由于android studio中是用grable来构建项目的,所以目录结构和叫法也不一样!
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Android开发Glide用过的人多吗_百度知道
Android开发Glide用过的人多吗
我有更好的答案
系统就开始安装驱动了4:执行:; 开发 , 选择【USB调试】3、如果是window系统,系统会提示安装驱动:选择正确的android sdk安装目录. 设置应用程序为调试模式。操作;, 如下:9. 执行真机调试操作:ECLIPSE调试对话框中,Target窗口中选择Manual,点击【debug】按钮,选择真机设备,打开命令窗口,检测手机设备是否已经被识别,如下所示:53 - HelloWorld] Success![ 22:打 头的行、选中手机设备,点击OK之后;true&quot: 编辑AndroidManifest.xml 增加调试参数android:debuggable=&.StatsResultActivity }8,然后点击下一步.StatsResultActivity on device[ 22;Android Application.intent.action:24:49 - HelloWorld] Installing HelloWorld.eightqiu.activity&#47.apk…[ 22:24主要通过以下几个步骤,弹出如下窗口:(重新启动系统之后才有这样的效果)7:24:57 - HelloWorld] ActivityManager: menu—&gt.intent.category、驱动安装完成之后,重启电脑(通常系统会有“安装新驱动,重启才能生效”的提示),这但应该明白吧5,这些行指明了在哪行代码出的错误10、手机通过数据线连接在电脑上2、设置android手机为USB调试模式。步骤.eightqiu.activity:24:49 - HelloWorld] Uploading HelloWorld.apk onto device ‘HT99YLG11834′[ 22: Intent { act=android,开始调试。注:不管是否启用ECLIPSE环境,任何Android软件只要在真机上运行发生异常,都可以在命令行窗口下查看具体异常信息; 设置 —& 应用程序 —&gt:24:53 - HelloWorld] Starting activity com./adb logcat 可以查看到更多的系统异常消息。在这些消息中要注意查看Caused by:1,程序就开始在真机上安装了,控制台输出如下信息:[ 22:“HT99YLG11834 device”就是检测到得手机设备6、接下来就开始在eclipse上调试android程序了,右击android工程-&Run as-&gt、重复第1步和第2步.LAUNCHER] cmp=com: Starting.MAIN cat=[android
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Android疑点难点
1、在build.gradle中添加依赖:
compile 'com.github.bumptech.glide:glide:3.7.0'
需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经添加了),还需要添加support-v4依赖:
compile'com.android.support:support-v4:23.3.0'
2、然后配置混淆规则:
-keeppublicclass
*implements
com.bumptech.glide.module.GlideModule
-keeppublic
com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$**
**[] $VALUES;
其中第一个混淆规则表明不混淆所有的GlideModule。&
如果需要的话,还需添加相应的权限:
android:name=&android.permission.INTERNET&
android:name=&android.permission.WRITE_EXTERNAL_STORAGE&
简单使用:
Glide.with(this).load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&).into(imageView);
Glide.with()使用
with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。with(Activity activity).使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。with(FragmentActivity activity).Glide的请求会受到FragmentActivity生命周期控制。with(android.app.Fragment fragment).Glide的请求会受到Fragment 生命周期控制。with(android.support.v4.app.Fragment fragment).Glide的请求会受到Fragment生命周期控制。
requestManager.load()使用
Glide基本可以load任何可以拿到的媒体资源,如:&
load&SD卡资源:load(&file://&+ Environment.getExternalStorageDirectory().getPath()+&/test.jpg&)&
load&assets资源:load(&file:///android_asset/f003.gif&)&
load&raw资源:load(&.resource://com.frank.glide/raw/raw_1&)或load(&android.resource://com.frank.glide/raw/&+R.raw.raw_1)&
load&drawable资源:load(&android.resource://com.frank.glide/drawable/news&)或load(&android.resource://com.frank.glide/drawable/&+R.drawable.news)&
load&ContentProvider资源:load(&content://media/external/images/media/139469&)&
load&http资源:load(&http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN_.jpg&)&
load&https资源:load(&
http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN_.jpg
当然,load不限于String类型,还可以:&
& load(Uri uri),load(File
file),load(Integer resourceId),load(URL
url),load(byte[] model),load(T
model),loadFromMediaStore(Uri uri)。&
load的资源也可以是本地视频,如果想要load网络视频或更高级的操作可以使用VideoView等其它控件完成。&
而且可以使用自己的ModelLoader进行资源加载:&
& using(ModelLoader&A, T& modelLoader, Class&T& dataClass),using(final
StreamModelLoader&T& modelLoader),using(StreamByteArrayLoader modelLoader),using(final
FileDescriptorModelLoader&T& modelLoader)。&
返回GenericRequestBuilder实例。
GenericRequestBuilder使用
GenericRequestBuilder&ModelType,DataType,ResourceType,TranscodeType&是最顶层的Request Builder,用于处理选项设置和开始一般resource类型资源的加载。其中ModelType是指代表资源的类型,如&&这个String就代表了一张图片资源,所以这个ModelType就是String。DataType是指ModelLoader提供的,可以被ResourceDecoder解码的数据类型。ResourceType是指将要加载的resource类型。TranscodeType是指已解码的资源将要被转成的资源类型。
thumbnail(float sizeMultiplier). 请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,就显示缩略图,否则就不显示。系数sizeMultiplier必须在(0,1)之间,可以递归调用该方法。sizeMultiplier(float sizeMultiplier). 在加载资源之前给Target大小设置系数。diskCacheStrategy(DiskCacheStrategy strategy).设置缓存策略。DiskCacheStrategy.SOURCE:缓存原始数据,DiskCacheStrategy.RESULT:缓存变换(如缩放、裁剪等)后的资源数据,DiskCacheStrategy.NONE:什么都不缓存,DiskCacheStrategy.ALL:缓存SOURC和RESULT。默认采用DiskCacheStrategy.RESULT策略,对于download only操作要使用DiskCacheStrategy.SOURCE。priority(Priority priority). 指定加载的优先级,优先级越高越优先加载,但不保证所有图片都按序加载。枚举Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。默认为Priority.NORMAL。dontAnimate(). 移除所有的动画。animate(int animationId). 在异步加载资源完成时会执行该动画。animate(ViewPropertyAnimation.Animator animator). 在异步加载资源完成时会执行该动画。placeholder(int resourceId). 设置资源加载过程中的占位Drawable。placeholder(Drawable drawable). 设置资源加载过程中的占位Drawable。fallback(int resourceId). 设置model为空时要显示的Drawable。如果没设置fallback,model为空时将显示error的Drawable,如果error的Drawable也没设置,就显示placeholder的Drawable。fallback(Drawable drawable).设置model为空时显示的Drawable。error(int resourceId).设置load失败时显示的Drawable。error(Drawable drawable).设置load失败时显示的Drawable。listener(RequestListener&? super ModelType, TranscodeType& requestListener). 监听资源加载的请求状态,可以使用两个回调:onResourceReady(R
resource, T model, Target&R& target, boolean isFromMemoryCache, boolean isFirstResource)和onException(Exception e, T model, Target&R& target,
boolean isFirstResource),但不要每次请求都使用新的监听器,要避免不必要的内存申请,可以使用单例进行统一的异常监听和处理。skipMemoryCache(boolean skip). 设置是否跳过内存缓存,但不保证一定不被缓存(比如请求已经在加载资源且没设置跳过内存缓存,这个资源就会被缓存在内存中)。override(int width, int height). 重新设置Target的宽高值(单位为pixel)。into(Y target).设置资源将被加载到的Target。into(ImageView view). 设置资源将被加载到的ImageView。取消该ImageView之前所有的加载并释放资源。into(int width, int height). 后台线程加载时要加载资源的宽高值(单位为pixel)。preload(int width, int height). 预加载resource到缓存中(单位为pixel)。asBitmap(). 无论资源是不是gif动画,都作为Bitmap对待。如果是gif动画会停在第一帧。asGif().把资源作为GifDrawable对待。如果资源不是gif动画将会失败,会回调.error()。
禁止内存缓存:
.skipMemoryCache(true)11
清除内存缓存:
Glide.get(context).clearMemory();1212
禁止磁盘缓存:
.diskCacheStrategy(DiskCacheStrategy.NONE)11
清除磁盘缓存:
Glide.get(applicationContext).clearDiskCache();1212
获取缓存大小:
new GetDiskCacheSizeTask(textView).execute(new File(getCacheDir(), DiskCache.Factory.DEFAULT_DISK_CACHE_DIR));11class GetDiskCacheSizeTask extends AsyncTask&File, Long, Long& {
private final TextView resultV
public GetDiskCacheSizeTask(TextView resultView) {
this.resultView = resultV
protected void onPreExecute() {
resultView.setText(&Calculating...&);
protected void onProgressUpdate(Long... values) {
protected Long doInBackground(File... dirs) {
long totalSize = 0;
for (File dir : dirs) {
publishProgress(totalSize);
totalSize += calculateSize(dir);
return totalS
} catch (RuntimeException ex) {
final String message = String.format(&Cannot get size of %s: %s&, Arrays.toString(dirs), ex);
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
resultView.setText(&error&);
Toast.makeText(resultView.getContext(), message, Toast.LENGTH_LONG).show();
return 0L;
protected void onPostExecute(Long size) {
String sizeText = android.text.format.Formatter.formatFileSize(resultView.getContext(), size);
resultView.setText(sizeText);
private static long calculateSize(File dir) {
if (dir == null) return 0;
if (!dir.isDirectory()) return dir.length();
long result = 0;
File[] children = dir.listFiles();
if (children != null)
for (File child : children)
result += calculateSize(child);
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
指定资源的优先加载顺序:
.with(context)
.load(heroImageUrl)
.priority(Priority.HIGH)
.into(imageViewHero);
.with(context)
.load(itemImageUrl)
.priority(Priority.LOW)
.into(imageViewItem);123456789101112123456789101112
先显示缩略图,再显示原图:
.with(this)
.load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&)
.thumbnail(0.1f)
.into(iv_0);
DrawableRequestBuilder&Integer& thumbnailRequest = Glide
.with(this)
.load(R.drawable.news);
Glide.with(this)
.load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&)
.thumbnail(thumbnailRequest)
.into(iv_0);12345678910111213141234567891011121314
对图片进行裁剪、模糊、滤镜等处理:&
推荐使用独立的图片处理库:,使用也很简单:
compile 'jp.wasabeef:glide-transformations:2.0.0'11
之后我们就可以使用GenericRequestBuilder或其子类的transform()或bitmapTransform()方法设置图片转换了:
Glide.with(this)
.load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&)
.bitmapTransform(new CropCircleTransformation(this))
.into(iv_0);
Glide.with(this)
.load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&)
.bitmapTransform(new RoundedCornersTransformation(this,30,0, RoundedCornersTransformation.CornerType.ALL))
.into(iv_0);
Glide.with(this)
.load(&http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png&)
.bitmapTransform(new GrayscaleTransformation(this))
.into(iv_0);
5、&Glide有哪些“坑”?
ImageView的setTag问题&
问题描述:如果使用Glide的into(imageView)为ImageView设置图片的同时使用ImageView的setTag(final
Object tag)方法,将会导致java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting异常。因为Glide的ViewTarget中通过view.setTag(tag)和view.getTag()标记请求的,由于Android
4.0之前Tag存储在静态map里,如果Glide使用setTag(int key, final Object tag)方法标记请求则可能会导致内存泄露,所以Glide默认使用view.setTag(tag)标记请求,你就不能重复调用了。&
解决办法:如果你需要为ImageView设置Tag,必须使用setTag(int key, final Object tag)及getTag(int
key)方法,其中key必须是合法的资源ID以确保key的唯一性,典型做法就是在资源文件中声明type=&id&的item资源。placeholder()导致的图片变形问题&
问题描述:使用.placeholder()方法在某些情况下会导致图片显示的时候出现图片变形的情况。这是因为Glide默认开启的crossFade动画导致的TransitionDrawable绘制异常,详细描述和讨论可以看一下这个&issue。根本原因就是你的placeholder图片和你要加载显示的图片宽高比不一样,而Android的TransitionDrawable无法很好地处理不同宽高比的过渡问题,这的确是个Bug,是Android的也是Glide的。&
解决办法:使用.dontAnimate()方法禁用过渡动画,或者使用animate()方法自己写动画,再或者自己修复TransitionDrawable的问题。
ImageView的资源回收问题&
问题描述:默认情况下,Glide会根据with()使用的Activity或Fragment的生命周期自动调整资源请求以及资源回收。但是如果有很占内存的Fragment或Activity不销毁而仅仅是隐藏视图,那么这些图片资源就没办法及时回收,即使是GC的时候。&
解决办法:可以考虑使用WeakReference,如:
final WeakReference&ImageView& imageViewWeakReference = new WeakReference&&(imageView);
ImageView target = imageViewWeakReference.get();
if (target != null) {
Glide.with(context).load(uri).into(target);
}1234512345ImageView的scaleType问题&
scaleType默认为fitCenter模式,如果你想设置成centerInside,不好意思,3.x还没有这个方法,参见这个&issue,折中的解决办法就是放弃使用centerInside,或者结合android:scaleType=&centerInside&和.dontTransform()使用以禁止Glide对资源进行转换。&
如果你想要ImageView的宽高根据图片资源的大小而定(即使用wrap_comtent),那么你就必须明确告诉Glide我想加载原始资源:使用android:scaleType=&center&,或者.dontTransform(),或者.override(Target.SIZE_ORIGINAL,
Target.SIZE_ORIGINAL)。&
不推荐使用fitXY,因为这样Glide会加载全尺寸图像到内存中而造成不必要的内存占用。
异步线程完成后加载图片的崩溃问题&
问题描述:通常情况下,异步线程会被约束在Activity生命周期内,所以异步线程完成后使用Glide加载图片是没有问题的。但如果你的异步线程在Activity销毁时没有取消掉,那么异步线程完成后就Glide就无法为一个已销毁的Activity加载图片资源,抛出的异常如下(在with()方法中就进行判断并抛出异常):
java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
at com.bumptech.glide.Glide.with(Glide.java:653)
at com.frank.glidedemo.TestActivity.onGetDataCompleted(TestActivity.java:23)
at com.frank.glidedemo.TestActivity.access$000(TestActivity.java:10)
at com.frank.glidedemo.TestActivity$BackgroundTask.onPostExecute(TestActivity.java:46)
at com.frank.glidedemo.TestActivity$BackgroundTask.onPostExecute(TestActivity.java:28)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
}12345678910111213141516171819201234567891011121314151617181920
解决办法:正确管理Background Threads(异步线程),当Activity停止或销毁时,停止所有相关的异步线程,停止所有后续的UI操作。或者加载前使用isFinishing()或isDestroyed()进行限制(不建议这种处理方式)。
由于Bitmap复用导致的在某些设备上图片错乱的问题&
问题描述:&Glide默认使用BitmapPool的方式对应用中用到的Bitmap进行复用,以减少频繁的内存申请和内存回收,而且默认使用的Bitmap模式为RGB565以减少内存开销。但在某些设备上(通常在Galaxy系列5.X设备上很容易复现)某些情况下会出现图片加载错乱的问题,具体详见这个&issue。原因初步确定是OpenGL纹理渲染异常。&
解决办法:GlideModule使用PREFER_ARGB_8888(Glide4.X已经默认使用该模式了),虽然内存占用比RGB565更多一点,但可以更好地处理有透明度Bitmap的复用问题。或者禁用Bitmap复用setBitmapPool(new
BitmapPoolAdapter())来修复这个问题(不推荐这种处理方式)
6、Picasso和Glide的区别
1、Glide比Picasso加载速度快
2、默认情况Glide更有利于减少OutOfMemoryError的发生,不过Picasso的图片质量更高
3、Glide支持gif,Picasso不支持
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5226次
排名:千里之外
原创:21篇
(1)(4)(1)(3)(7)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740890',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 开发机器人用什么语言 的文章

 

随机推荐