Glide4用法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013928412/article/details/83140713

开始

首先在app/build.gradle文件中增加如下依赖:

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

再添加上网络权限

加载图片

<?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">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="点击" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
public class MainActivity extends Activity {


    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);
    }

    public void click(View view) {
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).into(imageView);
    }

}

占位图

设置加载中图片:

        RequestOptions options = new RequestOptions().placeholder(R.mipmap.ic_loading);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

设置加载失败图片:

  RequestOptions options = new RequestOptions().placeholder(R.mipmap.ic_loading).error(R.mipmap.ic_fail);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

指定图片大小

Glide默认会根据ImageView的大小决定图片的大小,保证图片不会导致OOM,但是还是可以对图片的大小进行修改的

        RequestOptions options = new RequestOptions().override(100,100);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

如果想加载一张原始尺寸的图片,可以使用Target.SIZE_ORIGINAL关键字

 RequestOptions options = new RequestOptions().override(Target.SIZE_ORIGINAL);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

这样就不会压缩图片,会去加载原始图片,但是会导致出现OOM的风险。

缓存机制

Glide缓存的设计是三级缓存,两级内存缓存和一级硬盘缓存,默认情况下开启了内存缓存和硬盘缓存,如果需要将内存缓存禁掉,可以使用如下代码:

        RequestOptions options = new RequestOptions().skipMemoryCache(true);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

如果想禁掉硬盘缓存:

 RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(imageView);

对于硬盘缓存,有以下几种策略:

DiskCacheStrategy.NONE:表示不缓存

DiskCacheStrategy.DATA:只缓存原始图片

DiskCacheStrategy.RESOURCE:只缓存转换后的图片

DiskCacheStrategy.ALL:既缓存原始图片,也缓存转换后的图片

DiskCacheStrategy.AUTOMATIC:Glide根据图片资源自动的选择哪一种缓存策略(默认)

指定加载格式

Glide加载gif图片,会自动判断图片格式,显示出动态图片,但是如果即使是动态图片,也想让其静态显示,可以使用如下方法:

Glide.with(this).asBitmap().load(url).apply(options).into(imageView);

这样,Glide只会加载gif图片的第一帧,Glide还有asGif()、asFile()、asDrawable()

回调和监听

into

可以在加载图片到ImageView之前,对图片进行一些操作,可以使用此监听方法

 SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                imageView.setImageDrawable(resource);
            }
        };
        RequestOptions options = new RequestOptions();
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).into(simpleTarget);

preload

这个方法可以用于将图片预加载,然后在需要的时候可以直接从缓存中读取图片

        RequestOptions options = new RequestOptions();
        String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).preload();

submit

这个方法只会下载图片,不会加载图片,下载完毕之后,可以得到图片的下载路径,此时就可以进行一些后续处理

 new Thread() {
            @Override
            public void run() {
                final Context context = getApplicationContext();
                FutureTarget<File> target = Glide.with(context).asFile().load(url).submit();
                try {
                    final File file = target.get();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(context, file.getPath(), Toast.LENGTH_SHORT).show();
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        }.start();

listener

这个方法可以用来监听图片的加载状态,可以通过此方法监听图片加载成功或失败

        RequestOptions options = new RequestOptions();
        final String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                return false;
            }
        }).apply(options).preload();

返回值false表示这个事件不会被处理,还会继续传递下去,比如我们在onResourceReady方法中返回了true,那么就会不会回调Target的onResourceReady()方法了

图片转换

图片转换的意思就是Glide将图片加载到Image显示之前会进行一些转换操作,比如实现一些更加丰富的效果,比如圆角化、圆形化、模糊化等等

添加方法是只需要在RequestOptions中串接transform方法即可

        RequestOptions options = new RequestOptions().transform(...);
        final String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
        Glide.with(this).load(url).apply(options).preload();

一般情况下,进行如何的转换都是我们自己来实现的,但是Glide内置了一些转换的API

RequestOptions options = new RequestOptions()
        .centerCrop();

RequestOptions options = new RequestOptions()
        .fitCenter();

RequestOptions options = new RequestOptions()
        .circleCrop();

从名称我们就可以知道是什么意思,当然我们也可以自定义transform,继承自BitmapTransformation,具体可以参考源码中的内置的API进行自定义

关于图片变换,我们也可以使用开源库glide-transformations,实现了需要通用的图片变化效果,如裁剪变化、颜色变化、模糊变换等

glide-transformations的项目主页地址是 https://github.com/wasabeef/glide-transformations 。

本文参考郭霖大神关于Glide的博客

猜你喜欢

转载自blog.csdn.net/u013928412/article/details/83140713