图片加载框架Glide使用教程

本文介绍了Android图片加载框架Glide的使用,包括如何引入库,加载网络和本地图片,设置占位符和异常图片,加载Gif,以及通过override()方法调整图片尺寸。Glide以其强大的缓存机制和生命周期管理,优化了用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Glide简介:

Android常用的图片加载框架有Glide和Fresco,Picasso比Glide更加简洁和轻量,Glide比Picasso功能更为丰富。今天我们来讲解Glide的基本用法。目前我们使用Glide的稳定版本是3.7.0,要想使用Glide,我们首先要将这个库引入到我们的项目当中。

Glide引用:(添加Glide库到build.gradle)

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

Glide加载网络图片需要申请网络权限,给项目申请网络权限:

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

添加了Glide库和网络权限,我们接下来测试Glide的基本用法:

首先我们尝试加载一张图片,这是一张图片的地址:

"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=1" +
                "00&size=b4000_4000&sec=1552447551&di=fee8ca3e043e8b2c68d68648e5a93547&src=http" +
                "://pic.90sjimg.com/back_pic/00/00/52/00/4901c7e259661a93e1423c8c62341da8.jpg"

首先在布局文件添加一个ImageView控件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后在代码中用Glide加载网络图片:

//加载网络图片
    private void loadNetWorkImg() {
        String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=1" +
                "00&size=b4000_4000&sec=1552447551&di=fee8ca3e043e8b2c68d68648e5a93547&src=http" +
                "://pic.90sjimg.com/back_pic/00/00/52/00/4901c7e259661a93e1423c8c62341da8.jpg";
        ImageView img = this.findViewById(R.id.img);
        Glide.with(this).load(url).into(img);
    }

通过测试网络图片已经被加载出来,看看Glide核心代码

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

接下来我们了解Glide加载图片的过程,首先调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:

Glide这一行代码,做了非常多的事情,包含加载网络图片,加载手机本地图片,加载应用资源图片,例如:

加载应用资源图片:

    //加载资源图片
    private void loadResourceImg() {
        ImageView img = this.findViewById(R.id.img);
        Glide.with(this).load(R.mipmap.ic_launcher).into(img);
    }
从assets中获取图片用Glide显示,这里我们从assets中获取的文件流,但是我们将文件流保存在应用的缓存目录,然后在Glide文件中显示:
 //从assets中获取图片用Glide显示
    private void loadLocalImg() {
        ImageView img = this.findViewById(R.id.img);
        copyAssetAndWrite("timg.jpg");
        File dataFile=new File(getCacheDir(),"timg.jpg");
        Glide.with(this).load(dataFile).into(img);

    }


    /**
     * @Method copyAssetAndWrite
     * @Description 我们根据文件
     */
    private boolean copyAssetAndWrite(String fileName){
        try {
            File cacheDir = getApplicationContext().getCacheDir();
            if (!cacheDir.exists()){
                cacheDir.mkdirs();
            }
            File outFile =new File(cacheDir,fileName);
            if (!outFile.exists()){
                boolean res=outFile.createNewFile();
                if (!res){
                    return false;
                }
            }else {
                if (outFile.length()>10){//表示已经写入一次
                    return true;
                }
            }
            InputStream is = this.getAssets().open(fileName);
            FileOutputStream fos = new FileOutputStream(outFile);
            byte[] buffer = new byte[1024];
            int byteCount;
            while ((byteCount = is.read(buffer)) != -1) {
                fos.write(buffer, 0, byteCount);
            }
            fos.flush();
            is.close();
            fos.close();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

Glide占位图功能

有时候图片加载的时候,为了优化用户体验,我们在网络图片未显示出来的时候,设置一张占位符图片,Glide  API提供类占位符功能:

 Glide.with(this)
       .load(url)
       .placeholder(R.mipmap.ic_launcher)
       .into(img);

以上代码,我们在中间插入placeholder()方法,然后将占位图的资源ID传入到这个方法中,打开应用测试,很可能看不到占位图的效果,因为Glide有非常强大的缓存机制,因为加载网络图片Glide会自动的将图片缓存,下次加载的时候直接从缓存中读取,因为加载速度快,所以占位图可能来不及显示。

异常占位符

当网络断开,服务器出现问题,导致图片显示不了,所以需要异常提示,Glide提供了异常占位图如下代码:

Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .into(img);

Glide加载Gif图片

Glide加载gif图片,不需要写额外的代码,它内部会判断图片格式,还是调用之前的代码即可,如果只想让控件显示静态图片,我们可以在之前代码中间加入.asBitmap()方法。

Glide.with(this).load(url).asBitmap().into(img);

Glide的override()方法显示加载图片像素大小

以前我们在加载一张像素是1200*1200的图片,显示在像素大小为200*200的的ImageView中,如果我们不将图片进行压缩,直接读取到内存中,就会浪费内存,有时候多张这样的大图容易导致内存溢出,使用Glide,我们无需担心图片加载内存溢出,Glide会自动判断ImageView 的大小,然后之间这么大的图片加载到内存中,帮助APP节省内存开销。同时我们可以在Glide  Api中指定加载图片的大小。

Glide.with(this).load(url).asBitmap()
          .override(200,200).into(img);

Glide回调监听方法:

有时候加载大图,需要显示加载进度,或者显示大图加载错误提示,因此Glide为我们提供了RequestListener图片加载回调方法:

 Glide.with(this).load(url).listener(new RequestListener<String, GlideDrawable>() {
       @Override
       public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {

                return false;
       }
       @Override
       public boolean onResourceReady(GlideDrawable resource, String model, 
      Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {

                return false;
            }
       }).override(400,400).into(img);

这里我们在into()方法之前串接了一个listener()方法,然后实现了一个RequestListener的实例。其中RequestListener需要实现两个方法,一个onResourceReady()方法,一个onException()方法。从方法名上就可以看出来了,当图片加载完成的时候就会回调onResourceReady()方法,而当图片加载失败的时候就会回调onException()方法,onException()方法中会将失败的Exception参数传进来,这样我们就可以定位具体失败的原因了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值