使用Glide加载、缓存图片、解决背景出现浅绿色

之前一直使用Volley ImageLoader、或者Picasso,无意间发现Glide,觉得真的是棒棒的。

1、和其他的一样在Module的build.gradle中添加依赖

compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:23.3.0'
 
 
  • 1
  • 2
  • 1
  • 2

都可以看到我不只是添加了一个依赖,还有V4包的依赖,因为它要借助V4包工作。

2、Glide的使用和Picasso的使用十分相似都是.with().load.into()

Glide不仅可以加载网络的图片,还可以加在本地的资源,文件资源,最重要的是还可以加在GIF格式的图片。

1)Glide加载网络图片

Glide
    .with(context)
    .load("http://img.sc115.com/dm/pc/pic/1502shayikbbuw1.jpg")
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2)从资源中加载图片

Glide
    .with(context)
    .load(R.mipmap.image)
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3)从文件中加载

//这个文件可能不存在于你的设备中。然而你可以用任何文件路径,去指定一个图片路径。
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "20160323153033.jpg");

Glide
    .with(context)
    .load(file)
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4)从Uri中加载

//这可能是任何 Uri为了演示的目的我们只是用一个 launcher icon 去创建了一个 Uri 
Uri uri = resourceIdToUri(context, R.mipmap.image);

Glide
    .with(context)
    .load(uri)
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将id转换成Uri

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";

private static Uri resourceIdToUri(Context context, int resourceId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5)加载GIF图片

加载gif图片和加载正常的图片没有什么太大的区别

String gifUrl = "http://pic.qqtn.com/file/2013/2014-12/2014122616202514075.gif";
Glide  
    .with( context )
    .load( gifUrl )
    .into( imageViewGif );
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

这里我们可以稍做改动

//如果你期望这个 URL 是一个 Gif,Glide 不会自动检查是否是 Gif,所以强制转换
Glide.with( context ).load( gifUrl ).asGif().into( imageViewGif );

//显示的是GIF动画的第一帧,就是静止的图片
Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGif );
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

3、图片的加载会了,接下来看看如何设置图片的大小

如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小。

Glide
    .with(context)
    .load("http://p1.wmpic.me/article/2016/08/15/1471243206_FGLNjRtg_215x185.jpg")
    .override(600, 200) 
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

4、图像的缩放

CenterCrop()是一个裁剪技术,即缩放图像让它填充到 ImageView 界限内并且侧键额外的部分。ImageView 可能会完全填充,但图像可能不会完整显示。

Glide
    .with(context)
    .load(R.mipmap.image)
    .centerCrop() 
    .into(imageViewResizeCenterCrop);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

fitCenter() 是裁剪技术,即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围。该图像将会完全显示,但可能不会填满整个 ImageView。

Glide
    .with(context)
    .load(R.mipmap.image)
    .fitCenter() 
    .into(imageViewResizeFitCenter);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

5、缩略图

就是说我可以先加载图片的百分之多少来显示,然后在加载原图,用户体验比较好嘿嘿

Glide  
    .with( context )
    .load( "http://img.sc115.com/dm/pc/pic/1502shayikbbuw1.jpg" )
    .thumbnail(0.1f)
    .into(mImageView);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

例如, 你传了一个 0.1f 作为参数,Glide 将会显示原始图像的10%的大小。如果原始图像有 1000x1000 像素,那么缩略图将会有 100x100 像素。因为这个图像将会明显比 ImageView 小很多,你需要确保它的 ScaleType 的设置是正确的。

6、我们通过网络得到的图片有的时候不一定就直接设置到ImageView上,有的时候就只是要一个Bitmap

//当Glide加载完会被调用
private SimpleTarget target = new SimpleTarget<Bitmap>(){
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            //使用bitmap做一些事,如
            mImageView.setImageBitmap(resource);
        }
    };
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Glide
    .with(this)
    .load("http://img.sc115.com/dm/pc/pic/1502shayikbbuw1.jpg")
    .asBitmap() //必须写,否则会报类型转化异常
    .into(target); //此处为target
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

7、注意

如果看到这样的异常You cannot start a load for a destroyed activity 
请记住一句话:不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。

8、Glide加载图片背景出现浅绿色现象

原因:

Glide默认的Bitmap格式是RGB_565,这也是导致在加载图片是可能变绿的罪魁祸首。RGB_565代表8位RGB位图,而Picasso默认的Bitmap格式是ARGB_8888代表32位RGB位图,位图位数越高代表其可以存储的颜色信息越多,图像也就越逼真,这也是Picasso图像质量更好的原因了。

方案: 
1、使用Glide加载图片时:

Glide.with(context)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE)//是将图片原尺寸缓存到本地。
     .into(imageview);
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2、如果加上这一句代码图片仍然没有解决,可以将Bitmap的格式改为ARGB_8888。 
首先创建一个 GlideConfiguration类去实现GlideModule,修改Bitmap的格式。

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) {  

    }  
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然后在AndroidManifest.xml中加入:

<meta-data  
    android:name="你的包名.GlideConfiguration"  
    android:value="GlideModule"/>
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

提供两个链接:

Glide详解

一些常见问题

Glide加载图片出现浅绿色背景

转自:http://blog.csdn.net/hello_1s/article/details/52291363

Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有加载本地图片、远程图片GIF动画等功能。项目地址:https://github.com/bumptech/glide 你也可以直接下载jar包:https://github.com/bumptech/glide/releases 如何使用:创建个ImageView2. 获取图片并填充到ImageView  获取远程图片: Glide.with(this).load("http://www.see-source.com/source/img/logo_01.png").into(iv);   获取本地图片Glide.with(this).load(R.drawable.logo_01).into(iv);  获取GIF动画图片Glide.with(this).load(R.drawable.image02).into(iv);image02.gif是个动画图片具体功能如下:GIF 动画的解码 :通过调用Glide.with(context).load(“图片路径“)方法,GIF动画图片可以自动显示为动画效果。如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片本地视频剧照的解码: 通过调用Glide.with(context).load(“图片路径“)方法,Glide能够支持Android设备中的所有视频剧照的加载和展示缩略图的支持: 为了减少在同一个view组件里同时加载多张图片的时间,可以调用Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view组件“)方法加载一个缩略图,还可以控制thumbnail()中的参数的大小,以控制显示不同比例大小的缩略图Activity 生命周期的集成: 当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求转码的支持: Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode() 方法还能够改变图片的样式动画的支持: 新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能OkHttp 和Volley 的支持: 默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈其他功能: 如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值