初探Google推荐Android图片加载框架Glide

简介

现在在Android上加载图片的框架都已经烂大街了,所以我们这里也不说谁好谁坏,当然也不做比较了,因为得出的结果都是片面的,没有谁好谁坏只有适不适合需求罢了

起因是在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个叫Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年Google I/O大会上发布的官方App。需要特别说明的是这个不是一个官方库,个人感觉和Picasso特别像,当然这是第一个感觉,其实内部还真不太一样,这是英文地址当然国内也翻译的参考这个里

当然啦还是安装我写博客的一贯作风啦,上来还是先运行下Demo,这样既然查看到要学这个库一些效果,更能理解大神的项目架构,多学学大神们的项目架构还是很有帮助的

运行Demo

首先我来到Glide的github上,可以看到这么多内

是不是一大部分看到这么多文件,都蒙蔽了,这

按照Build的方式下载源代码,而不是通过Download zip来下载,这里简单总结下步骤

1
git clone https://github.com/bumptech/glide.git

我们将代码clone到本地,然后使用android studio导入选择最外层的build.gradle文件,成功导入后如下图

其中:
library:是glide的源码
samples:里面都是demo了
third_party:是library的一些依赖库

现在我们可以运行一下其中的demo了,我们这里运行gallery,可以直接在android studio中运行,可以使用如下命令:

1
2
3
./gradlew :samples:flickr:run
./gradlew :samples:giphy:run
./gradlew :samples:svg:run

可以看到这里运行的是demo下面的一个工程的run方法,我们来看看大神们是怎么实现的,我们在gallery的build.gradle文件中到了如下代码

1
2
3
4
task run(type: Exec, dependsOn: 'installDebug') {
description 'Installs the APK and runs the main activity: "gradlew :samples:???:run"'
commandLine "${android.sdkDirectory}/platform-tools/adb", 'shell', 'am', 'start', '-n', 'com.bumptech.glide.samples.gallery/.MainActivity'
}

这下我们就明白了他运行的run方式怎么来的了吧

还有一个值得学习的地方是,统一把sdk版本和依赖包的版本都放到了gradle.properties文件中,这样做的好处是,如果要更换版本只需要改这一个文件里面的就行了,那我们就来看看他是怎么写的吧,这里只看了gallery目录的build.gradle文件,其他的文件都差不多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apply plugin: 'com.android.application'
dependencies {
compile project(':library')
compile(project(':integration:recyclerview')) {
transitive = false
}
compile "com.android.support:support-v4:${SUPPORT_V4_VERSION}"
compile "com.android.support:recyclerview-v7:${SUPPORT_V7_VERSION}"
}
android {
compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION
defaultConfig {
applicationId 'com.bumptech.glide.samples.gallery'
minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
task run(type: Exec, dependsOn: 'installDebug') {
description 'Installs the APK and runs the main activity: "gradlew :samples:???:run"'
commandLine "${android.sdkDirectory}/platform-tools/adb", 'shell', 'am', 'start', '-n', 'com.bumptech.glide.samples.gallery/.MainActivity'
}

可以看到${SUPPORT_V4_VERSION},COMPILE_SDK_VERSION这样的变量,然而他的值是在gradle.properties文件中设置的

1
2
3
4
COMPILE_SDK_VERSION=22
BUILD_TOOLS_VERSION=22.0.1
TARGET_SDK_VERSION=22
MIN_SDK_VERSION=10

个人觉得使用这种方式来管理一个项目的一些参数都是很不错的,比如:编译sdk版本,依赖版本或者是一些配置参数

这里可以查看到官网编译好的jar包

可以看到这个demo会显示我们手机里所有的图片

现在demo的运行就介绍到这里了,至于其他的,大家就可以自己改改demo然后运行看到效果了,现在就来说说常用的使用方法

安装依赖包

这个方式就有很多了,大家选用自己适合的方式

现在编译好的依赖

这里可以下载官方已经编译好的jar

Gradle

因为Glide的库已经上传到了jcenter,所以我们可以直接在项目最外层的build.gradle文件中添加依赖

1
2
3
4
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}

Maven

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.github.bumptech.glide</groupId>
<artifactId>glide</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>support-v4</artifactId>
<version>r7</version>
</dependency>

Proguard

这一步非常重要,所以不管你混不混淆都添加上,不然哪天想混淆了,到处找要忽略的包,这是一件很痛苦的事情,因为你的依赖库肯定不止这一个

1
2
3
4
5
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

简单使用

这一步都很简单啦,不用过多解释,直接看代码

1
Glide.with(this).load(imgUrl).centerCrop().into(iv1);

设置暂未图和加载失败图

1
Glide.with(context).load(datas.get(position)).placeholder(R.drawable.ic_launcher).error(R.drawable.error).centerCrop().crossFade().into(holder.iv);

加载封面图

一般情况下封面图可以是一个真是图片的小图或者是低像素版

1
Glide.with(this).load(url).thumbnail(Glide.with(this).load(thumbUrl)).centerCrop().into(iv2);

从其他路径加载图片

通过API我们可以看见他重载了很多个方法

其中还有个自定义加载路径

加载图片到其他控件

这个需求是很常见的,比如我们需要为一个LinearLayout加载一个背景图片。其中可以用官方提供自定义Target的方法

1
2
3
4
5
6
Glide.with(this).load(imgUrl).into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
linearLayout.setBackgroundDrawable(resource);
}
});

调试信息

这些说明也可以在官网查看到

开启请求响应信息

在终端中执行

1
adb shell setprop log.tag.GenericRequest DEBUG

开启后我们可以查看logcat中输出这样的信息

开启工作流日志

意思就是可以查看到内部是怎么查找资源,例如:是从内存,还是磁盘或网络获取的资源

1
2
3
adb shell setprop log.tag.Engine VERBOSE
adb shell setprop log.tag.EngineJob VERBOSE
adb shell setprop log.tag.DecodeJob VERBOSE

开启后输入如下日志信息

好了,基本使用就到这里了,下一篇会从源码的角度带你熟悉Glide,这样正好也学一学大师们怎么架构一个项目的,并且还能学到一些Glide高级使用,以上测试代码在我的github上了

参考:http://www.open-open.com/lib/view/open1440397324450.html

任苹蜻 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章