简介
现在在Android上加载图片的框架都已经烂大街了,所以我们这里也不说谁好谁坏,当然也不做比较了,因为得出的结果都是片面的,没有谁好谁坏只有适不适合需求罢了
起因是在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个叫Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年Google I/O大会上发布的官方App。需要特别说明的是这个不是一个官方库,个人感觉和Picasso特别像,当然这是第一个感觉,其实内部还真不太一样,这是英文地址,当然国内也翻译的参考这个里
当然啦还是安装我写博客的一贯作风啦,上来还是先运行下Demo,这样既然查看到要学这个库一些效果,更能理解大神的项目架构,多学学大神们的项目架构还是很有帮助的
运行Demo
首先我来到Glide的github上,可以看到这么多内
是不是一大部分看到这么多文件,都蒙蔽了,这
按照Build的方式下载源代码,而不是通过Download zip来下载,这里简单总结下步骤
git clone https://github.com/bumptech/glide.git
我们将代码clone到本地,然后使用android studio导入选择最外层的build.gradle文件,成功导入后如下图
其中:
library:是glide的源码
samples:里面都是demo了
third_party:是library的一些依赖库
现在我们可以运行一下其中的demo了,我们这里运行gallery,可以直接在android studio中运行,可以使用如下命令:
./gradlew :samples:flickr:run
./gradlew :samples:giphy:run
./gradlew :samples:svg:run
可以看到这里运行的是demo下面的一个工程的run方法,我们来看看大神们是怎么实现的,我们在gallery的build.gradle文件中到了如下代码
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文件,其他的文件都差不多
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文件中设置的
COMPILE_SDK_VERSION=22
BUILD_TOOLS_VERSION=22.0.1
TARGET_SDK_VERSION=22
MIN_SDK_VERSION=10
个人觉得使用这种方式来管理一个项目的一些参数都是很不错的,比如:编译sdk版本,依赖版本或者是一些配置参数
这里可以查看到官网编译好的jar包
可以看到这个demo会显示我们手机里所有的图片
现在demo的运行就介绍到这里了,至于其他的,大家就可以自己改改demo然后运行看到效果了,现在就来说说常用的使用方法
安装依赖包
这个方式就有很多了,大家选用自己适合的方式
现在编译好的依赖
Gradle
因为Glide的库已经上传到了jcenter,所以我们可以直接在项目最外层的build.gradle文件中添加依赖
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
Maven
<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
这一步非常重要,所以不管你混不混淆都添加上,不然哪天想混淆了,到处找要忽略的包,这是一件很痛苦的事情,因为你的依赖库肯定不止这一个
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
简单使用
这一步都很简单啦,不用过多解释,直接看代码
Glide.with(this).load(imgUrl).centerCrop().into(iv1);
设置暂未图和加载失败图
Glide.with(context).load(datas.get(position)).placeholder(R.drawable.ic_launcher).error(R.drawable.error).centerCrop().crossFade().into(holder.iv);
加载封面图
一般情况下封面图可以是一个真是图片的小图或者是低像素版
Glide.with(this).load(url).thumbnail(Glide.with(this).load(thumbUrl)).centerCrop().into(iv2);
从其他路径加载图片
通过API我们可以看见他重载了很多个方法
其中还有个自定义加载路径
加载图片到其他控件
这个需求是很常见的,比如我们需要为一个LinearLayout加载一个背景图片。其中可以用官方提供自定义Target的方法
Glide.with(this).load(imgUrl).into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
linearLayout.setBackgroundDrawable(resource);
}
});
调试信息
这些说明也可以在官网查看到
开启请求响应信息
在终端中执行
adb shell setprop log.tag.GenericRequest DEBUG
开启后我们可以查看logcat中输出这样的信息
开启工作流日志
意思就是可以查看到内部是怎么查找资源,例如:是从内存,还是磁盘或网络获取的资源
adb shell setprop log.tag.Engine VERBOSE
adb shell setprop log.tag.EngineJob VERBOSE
adb shell setprop log.tag.DecodeJob VERBOSE
开启后输入如下日志信息
好了,基本使用就到这里了,下一篇会从源码的角度带你熟悉Glide,这样正好也学一学大师们怎么架构一个项目的,并且还能学到一些Glide高级使用,以上测试代码在我的github上了