安卓系列之第三方库Glide基础篇

634 阅读5分钟

公司最近搞技术分享,看着后端大佬们都是源码阅读,真真厉害,我很慌。今天尝试阅读了Glide的源码,没怎么看懂,所以这篇文章是结合工作中遇到的图片加载的各类需求,记录Glide的基础用法,方便后续使用,源码篇会在后续充分了解了重新开一篇。

Glide相关信息

项目引用Glide

在项目的Build.gradle(app)文件中添加如下代码:

repositories {
  google()
  jcenter()
}

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}

涉及权限

网络权限,用URL或一个网络连接中加载数据需要。
网络状态权限,便于从URL加载图片时,可自动处理片状网络连接。
读取权限,用于读取本地文件。
存储权限,使用ExternalPreferredCacheDiskCacheFactory将缓存存储到公有SD卡。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

混淆配置

#===================glide===================
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep class * extends com.bumptech.glide.module.AppGlideModule {
 <init>(...);
}
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {
  *** rewind();
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

不同图片需求如何使用

基础使用

一般的图片资源,比如资源文件,网络图片等,使用方法如下:

    /**
     * 基础使用
     * this---上下文
     * R.mipmap.pic---图片资源(资源文件,GIF图片,网络图片等)
     * mBinding.ivOne---ImageView控件
     */
    private void basic() {
        Glide.with(this).load(R.mipmap.pic).into(mBinding.ivOne);
    }

指定GIF图片

使用asGif(),图片资源必须是GIF格式,不然无法正常显示,代码如下:

    /**
     * 指定GIF图片
     * 注:只能使用GIF格式的图片,不然无法显示
     * this---上下文
     * asGif()---设置为GIF
     * R.mipmap.gif---动态图片资源
     * mBinding.ivTwo---ImageView控件
     */
    private void basicWithGif() {
        Glide.with(this).asGif().load(R.mipmap.gif).into(mBinding.ivTwo);
    }

指定占位符

占位符分为三种,分别是占位符(Placeholder),错误符(Error) ,后备回调符(Fallback)。
占位符(Placeholder)
显示在请求到资源之前,若请求资源为空且未设置错误符和后备回调符则会一直显示。

    /**
     * 占位符(Placeholder)
     * 显示在请求到资源之前,若请求资源为空且未设置错误符和后备回调符则会一直显示。
     * .placeholder(new ColorDrawable(Color.GRAY))设置为灰色背景
     * .placeholder()--参数为int或者Drawable
     */
    private void basicWithPlaceholder() {
        Glide.with(this).load("").placeholder(new ColorDrawable(Color.GRAY)).into(mBinding.ivThree);
    }

错误符(Error)
显示在请求资源失败后,若请求资源为空且未设置后备回调符则会显示。

    /**
     * 错误符(Error)
     * 若请求资源失败或者为空且未设置后备回调符则会显示。
     * .error(new ColorDrawable(Color.RED))设置失败为红色背景
     * .error()--参数为int或者Drawable
     */
    private void basicWithError() {
        Glide.with(this).load("").error(new ColorDrawable(Color.RED)).into(mBinding.ivFour);
    }

后备回调符(Fallback)
显示在请求资源为空后,则设置默认显示的资源。

    /**
     * 后备回调符(Fallback)
     * 显示在请求资源为空后,则设置默认显示的资源。
     * .fallback(R.mipmap.no_data)设置为默认的没有数据的图片
     * .fallback()--参数为int或者Drawable
     */
    private void basicWithFallback() {
        Bitmap bitmap = null;
        Glide.with(this).load(bitmap).fallback(R.mipmap.no_data).into(mBinding.ivFive);
    }

变换

RequestOptions
根据其规则设置填充方式,或者圆角度等基础的图片变换达到场景需求,比如圆形头像。

    /**
     * RequestOptions
     * 带有特殊处理的图片选项,例如填充方式,圆形,Corners(角弧度)等
     */
    private void basicWithRequestOptions() {
        //圆形图片
        RequestOptions circle = RequestOptions.circleCropTransform();
        Glide.with(this).applyDefaultRequestOptions(circle).load(R.mipmap.pic).into(mBinding.ivSix);
        //圆形图片
//        Glide.with(this).load(R.mipmap.pic).apply(RequestOptions.bitmapTransform(new CircleCrop())).into(mBinding.ivSix);
        //填充方式,中间剪切 高度改为宽度一半看效果
//        Glide.with(this).load(R.mipmap.pic).centerCrop().into(mBinding.ivSix);
        //角弧度
//        RoundedCorners roundedCorners = new RoundedCorners(100);
//        RequestOptions options = RequestOptions.bitmapTransform(roundedCorners);
//        Glide.with(this).load(R.mipmap.pic).apply(options).into(mBinding.ivSix);
    }

过渡选项TransitionOptions
控制资源文件载入时的效果

    /**
     * 过渡选项
     * 即图片载入时的动画效果
     * DrawableTransitionOptions普通图片
     * BitmapTransitionOptions请求Bitmap时使用
     */
    private void basicWithTransitionOptions() {
        //交叉淡入  load()中加入网络图片地址,效果明显
        Glide.with(this).load("").transition(withCrossFade()).into(mBinding.ivSeven);
    }

缩略图Thumbnail
图片软件中常用到先加载一张缩略图,然后网络加载完原图后替换缩略图,这样做的效果时,用户可以先看到图片内容,不至于是一片空白,加强交互效果。

    /**
     * 缩略图
     * 用于加载高质量图片之前加载
     * 两种方法,一种是后端提供缩略图和原图;一种是只有原图的情况下,设置缩略比例。
     */
    private void basicWithThumbnail() {
//        Glide.with(this).load("原图地址").thumbnail(Glide.with(this).load("缩略图地址")).into(mBinding.ivEight);
        Glide.with(this).load("原图地址").thumbnail(0.25f).into(mBinding.ivEight);
    }

缓存

分为两种:磁盘缓存和内存缓存。

    /**
     * 缓存相关
     * 磁盘缓存策略(Disk Cache Strategy)
     * ALL:既缓存原始图片,也缓存转换过后的图片;
     * AUTOMATIC (默认策略):它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换,裁剪–译者注)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
     * DATA:只缓存未被处理的文件。我的理解就是我们获得的 stream。它是不会被展示出来的,需要经过装载decode,对图片进行压缩和转换,等等操作,得到最终的图片才能被展示。
     * NONE:表示不缓存任何内容。
     */
    private void basicWithCache() {
        //磁盘缓存策略
        Glide.with(this)
                .load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(mBinding.ivNine);
        //仅从缓存加载图片
        //如果图片在内存缓存或在磁盘缓存中,它会被展示出来。否则只要这个选项被设置为true,这次加载会视同失败。
        Glide.with(this)
                .load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
                .onlyRetrieveFromCache(true)
                .into(mBinding.ivTen);
        //跳过缓存
        Glide.with(this)
                .load("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606658922596&di=f449f13a338c9fa2895f003b48b73c6e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F13%2F41%2F01300000201800122190411861466.jpg")
                .skipMemoryCache(true//跳过内存缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE) //跳过磁盘缓存
                .into(mBinding.ivEleven);
    }

获取Bitmap

在有些地方我们需要网络图片转为Bitmap格式,方便后续应用,这时可以用Glide实现转换,但是这个方法已经过时,使用上需要注意。

    /**
     * 获取Bitmap
     */
    private void getBitmapWithGlide(){
        Glide.with(this)
                .asBitmap()
                .load("网络图片地址")
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        mBinding.ivTwelve.setImageBitmap(resource);
                    }
                });
    }

缓存刷新

网络图片地址不变,更好图片,应用不写在卸载重新安装的情况下,图片没有刷新。此时我们可以定制缓存刷新策略来进行图片的更新 .signature()方法。

若帅哥美女对该系列文章感兴趣,可微信搜索公众号(木子闲集)关注更多更新文章哦,谢谢~