Glide是一款快速高效的Android图像加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。android
Glide 支持拉取,解码和展现视频快照,图片,和GIF动画。git
Glide默认使用的是HttpUrlConnection类下载图片,可是也提供了与Google Volley和Square OkHttp快速集成的工具库。github
虽然Glide 的主要目标是让任何形式的图片列表的滚动尽量地变得更快、更平滑,但实际上,Glide几乎能知足你对远程图片的拉取/缩放/显示的一切需求。api
Glide支持在线依赖,目前最新版本是4.8.0,在build.gradle文件中dependencies属性下增长两行代码。数组
dependencies { compile 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
Glide通常状况下须要向AndroidManifest.xml文件中添加如下四个权限:android-studio
<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加载图片很是简单,只须要一行代码:缓存
Glide.with(this) .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(imageView);
上面这行代码前后调用了三个方法:网络
固然咱们还能够取消加载,可是通常状况不须要使用,由于Glide.with()方法中传入的Activity或者Fragment实例销毁时,Glide 会自动取消加载并回收资源。app
其实Glide是能够经过后台线程获取Bitmap的,在后台线程中直接使用submit(int, int)方法。异步
new Thread(runnable).start(); //在后台线程中获取bitmap Runnable runnable=new Runnable() { @Override public void run() { FutureTarget<Bitmap> futureTarget = Glide.with(MainActivity.this) .asBitmap() .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .submit(); try { Bitmap bitmap = futureTarget.get(); Log.i("ansen","获取的bitmap:"+bitmap); //当上面获取的bitmap使用完毕时,调用clear方法释放资源 Glide.with(MainActivity.this).clear(futureTarget); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } };
首先新建一个线程,跟前面的加载图片不一样的是咱们调用了submit方法,这个方法能够传入一个宽高也能够不传,同时返回FutureTarget对象,在调用get方法获取咱们须要的Bitmap,当咱们获取的bitmap使用完毕时,记得调用clear方法释放资源。
futureTarget.get方法会抛出异常,须要用try catch捕捉。
固然,若是你不想开一个线程获取Bitmap也是能够的,能够经过主线程异步获取Bitmap方式。
Glide.with(this) .asBitmap() .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { //这里咱们拿到回掉回来的bitmap,能够加载到咱们想使用到的地方 imageView.setImageBitmap(resource); } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { super.onLoadFailed(errorDrawable); Log.i("ansen", "图片加载失败"); } });
从上述代码中能够看到,into方法传入的是一个SimpleTarget对象,这个类是一个抽象类,这里咱们使用内部类方式实现,重写这个类的两个方法(onResourceReady和onLoadFailed),onResourceReady加载图片成功会回调,同时把Bitmap当参数返回。onLoadFailed方法加载图片失败回调。
若是你觉得Glide只能加载网络图片的话,那就不会有这么多人使用了,他还能支持Resources资源、File资源、Uri资源、字节数组等方式加载。
Glide.with(context).load(resourceId).into(imageView); Glide.with(context).load(file).into(imageView); Glide.with(context).load(uri).into(imageView); Glide.with(context).load(byte[]).into(imageView);
Glide支持直接加载Gif图片,使用也很简单,就多调用一个asGif方法而已
Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);
Glide v4 使用 注解处理器 (Annotation Processor) 来生成出一个 API,在 Application 模块中可以使用该流式 API 一次性调用到 RequestBuilder, RequestOptions 和集成库中全部的选项。
Generated API 模式的设计出于如下两个目的:
Generated API 目前仅能够在 Application 模块内使用。这一限制可让咱们仅持有一份 Generated API,而不是各个 Library 和 Application 中均有本身定义出来的 Generated API。
这一作法会让 Generated API 的调用更简单,并确保 Application 模块中 Generated API 调用的选项在各处行为一致。这一限制在接下来的版本中也许会被取消(以实验性或其余的方式给出)。
在app模块中使用Generated API,须要两个步骤:
1.添加 Glide 注解处理器的依赖
dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' }
咱们文章开头讲解Android Studio在线依赖的时候就有包含这个,因此这个步骤能够忽略。
在 Application 模块中包含一个 AppGlideModule 的实现
咱们新建一个类,类名叫MyAppGlideModule,名字能够随便起,可是必需要继承自AppGlideModule,以及给类加上@GlideModule注解标记。
import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.module.AppGlideModule; /** * @author ansen * @create time 2018/10/28 */ @GlideModule public final class MyAppGlideModule extends AppGlideModule { }
Android Studio 在大多数时候均可以正确地处理注解处理器 (annotation processor) 和 generated API。然而,当你第一次添加 AppGlideModule 时,须要从新 (rebuild) 一下项目。否则使用GlideApp类时会提示找不到这个类。
Generated API 默认名为 GlideApp ,使用起来跟以前Glide方式同样,只须要把Glide替换成GlideApp,例如加载在线图片显示,代码以下:
//Generated API 使用方式 GlideApp.with(this) .load("https://github.com/ansen666/images/blob/master/" + "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true") .into(imageView);
与 Glide.with() 不一样,诸如 fitCenter() 和 placeholder() 等选项在 Builder 中直接可用,并不须要再传入单独的 RequestOptions 对象。
今天Glide就给你们介绍到这里了,接下来我还会讲解Glide占位符、动画、Target、配置、缓存、集成Okhttp等一系列文章,但愿你们持续关注,新的一个礼拜又开始了,祝你们工做愉快。
源码下载:
https://github.com/ansen666/GlideTest
若是你想第一时间看个人后期文章,扫码关注公众号,长期推送Android开发文章、最新动态、开源项目,让你各类涨姿式。
Android开发666 - 安卓开发技术分享 扫描二维码加关注