重拾Android之路(十九)Glide框架

Glide目前项目中使用到的是两个版本,一个是3.x,另外一个是4.x的。两个版本有一定的差异

Glide 3.x

首先添加依赖

implementation 'com.github.bumptech.glide:glide:3.7.0'

添加网络请求权限

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

代码实现起来比较简单,这里只贴出来逻辑代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.btn);
        img = findViewById(R.id.img);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Glide
                        .with(MainActivity.this)
                        .load(gifUrl)
                        .placeholder(R.mipmap.ic_launcher)
                        .diskCacheStrategy(DiskCacheStrategy.NONE) //设置不要执行硬盘缓存
                        .error(R.mipmap.ic_launcher_round)
                        .into(img);
            }
        });
    }

从代码中我们发现,其实核心代码只有一行:

Glide.with(this).load(url).into(imageView);

这一行代码虽然少,但是使用的内容却很多,包括了网络请求,图片加载,图片缓存,图片载入等功能。
首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContext,传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。
接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:

private void loadLocalImage(String fileName) {
        File file = new File(getExternalCacheDir() + fileName);
        Glide.with(this).load(imgUrl).into(img);
    }

    private void loadAssetImage() {
        int resource = R.mipmap.ic_launcher;
        Glide.with(this).load(resource).into(img);
    }

    private void loadBytesImage() {
        byte[] image = new byte[1024];
        Glide.with(this).load(imgUrl).into(img);
    }

    private void loadUriImage() {
        Uri imageUri = null;
        Glide.with(this).load(imageUri).into(img);
    }

最后看一下into()方法,这个方法就很简单了,我们希望让图片显示在哪个ImageView上,把这个ImageView的实例传进去就可以了。当然,into()方法不仅仅是只能接收ImageView类型的参数,还支持很多高级技巧,慢慢来。
这里还有其他几个小功能,占位图,错误图和本地硬盘缓存机制。分别代表的是placeholdererrordiskCacheStrategy
这里我们不仅可以由以上的几个情况,还可以指定当前加载图片的格式,如我们请求到的图片是一个gif图,我们可以强制将他设置为普通图片,通过asBitmap()方法去实现。这里gif图片不会动态播放,而是定格在第一帧的位置。这里需要注意一下,asBitmap()方法只能放在特定的位置,有时候我们放置的位置不对,会有报错。

Glide
                        .with(MainActivity.this)
                        .load(gifUrl)
                        .asBitmap()
                        .placeholder(R.mipmap.ic_launcher)
                        .diskCacheStrategy(DiskCacheStrategy.NONE) //设置不要执行硬盘缓存
                        .error(R.mipmap.ic_launcher_round)
                        .into(img);

设置加载图片的大小
在实际开发中,我们经常遇到服务器返回的图片尺寸较大,和我们想要展示的imageview大小不相符的情况,对于这样的情况,我们可以通过Glide有效的避免OOM的发生。我们可以通过override方法实现,里面传递需要设置的宽高等数据。

Glide加载图片显示加载百分比

这个网上有很多解答,不过一直没有找到理想的,不过经过自己的摸索和试验,终于自己搞到了一套加载图片显示加载百分比的方法,这个方法还是比较简单的

  1. 首先需要添加gradle的依赖
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.0.0'
  1. 新建一个类 ,命名为MyGlideModule,然后让他继承AppGlideModule,然后在当前这个类中,我们需要重写一些方法使Glide得获取图片的网络请求方式发生改变
    具体的使用方式是:
@GlideModule
public class MyGlideModule extends AppGlideModule {

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        // 添加拦截器到Okhttp
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(new ProgressInterceptor());
        OkHttpClient okHttpClient = builder.build();

        // 更换底层使用Okhttp
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
    }


    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }
}

其中ProgressInterceptor是一个拦截器,需要我们自己去重写这个类,后面会说到。
除了这一点之外,我们还要注意,在这里我们用到注解@GlideModule。当完成这些之后,需要立刻运行build中的make project方法,就可以生成GlideApp类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android图片框架Glide-3.7.0(最新,很强大),超好用的图片框架(包含jar和源码) Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。近日,Glide 3.0发布,现已提供 jar包下载 ,同时还支持使用Gradle以及Maven进行构建。该版本包括很多值得关注的新功能,如支持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、付费专栏及课程。

余额充值