Glide二次封装库的使用
更多代码可以查询本人GitHub:欢迎阅读,star点起来。
Glide二次封装库源码
前言
为什么选择Glide?
- Glide 轻量级
- 速度快
- 可以根据所需加载图片的大小自动适配所需分辨率的图
- 支持多种格式图片(静态webp,动态gif,jpeg,jpg,png)
- 支持多种数据源图片(url,drawable,src,file,asserts,raw)
- Google主导
- 更多知识点可以看我的上一篇文章:
Picasso,Glide,Fresco对比分析
http://blog.csdn.net/github_33304260/article/details/70213300
已经很方便了,为啥还要封装?
- 避免以后换框架的时候需要改的地方太多。如果封装了只需要改封装的方法而不会影响到所有的代码。
- 入口统一,所有图片加载都在这一个地方管理,一目了然,即使有什么改动我也只需要改这一个类就可以了。
- 虽然现在的第三方库已经非常好用,但是如果我们看到第三方库就拿来用的话,很可能在第三方库无法满足业务需求或者停止维护的时候,发现替换库,工作量可见一斑。这就是不封装在切库时面临的窘境!
- 外部表现一致,内部灵活处理原则
- 更多内容参考:如何正确使用开源项目?
初识Glide
Glide配置
1、 在build.gradle中添加依赖:
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}
2、混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
3、权限
如果是联网获取图片或者本地存储需要添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Glide基本使用
Glide使用一个流接口(Fluent Interface)。用Glide完成一个完整的图片加载功能请求,需要向其构造器中至少传入3个参数,分别是:
- with(Context context)- Context是许多Android API需要调用的, Glide也不例外。这里Glide非常方便,你可以任意传递一个Activity或者Fragment对象,它都可以自动提取出上下文。
- load(String imageUrl) - 这里传入的是你要加载的图片的URL,大多数情况下这个String类型的变量会链接到一个网络图片。
- into(ImageView targetImageView) - 将你所希望解析的图片传递给所要显示的ImageView。
example:
ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
String internetUrl = "http://i.imgur.com/DvpvklR.png";
Glide
.with(context)
.load(internetUrl)
.into(targetImageView);
更多Glide详细介绍可以看Glide官网以及Glide教程系列文章
如何进行二次封装
明白了为什么封装以及基本原理,接下来我们就要开工,大干一场。
先看一下本人封装后的基本使用样式:
ImageLoader.with(this)
.url("http://img.yxbao.com/news/image/201703/13/7bda462477.gif")
.placeHolder(R.mipmap.ic_launcher,false)
.rectRoundCorner(30, R.color.colorPrimary)
.blur(40)
.into(iv_round);
从这里可以看出我们提供了四个构造器,这里注释详细说明了所有参数的用法及意义。
除了初始化,我们还需要在Application中重写以下方法:
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
// 程序在内存清理的时候执行
ImageLoader.trimMemory(level);
}
@Override
public void onLowMemory() {
super.onLowMemory();
// 低内存的时候执行
ImageLoader.clearAllMemoryCaches();
}
上面这两个方法会在下面ImageLoader中介绍到。
你所关心的类–ImageLoader
ImageLoader是封装好所有的方法供用户使用的,让我们看看都有什么方法:
- ImageLoader.init(Context context) //初始化
- ImageLoader.trimMemory(int level);
- ImageLoader.clearAllMemoryCaches();
- ImageLoader.getActualLoader(); //获取当前的loader
- ImageLoader.with(Context context) //加载图片
- ImageLoader.saveImageIntoGallery(DownLoadImageService downLoadImageService) // 保存图片到相册
- ImageLoader.pauseRequests() //取消请求
- ImageLoader.resumeRequests() //回复的请求(当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求 等等)
- ImageLoader.clearDiskCache()//清除磁盘缓存(必须在后台线程中调用)
- ImageLoader.clearMomoryCache(View view) //清除指定view的缓存
- ImageLoader.clearMomory() // 清除内存缓存(必须在UI线程中调用)
图片的各种设置信息–SingleConfig
我们所设置图片的所有属性都写在这个类里面。下面我们详细的看一下:
- url(String url) //url
- file(String filePath) //加载SD卡资源
- file(File file) //加载SD卡资源
- res(int resId) //加载drawable资源
- content(String contentProvider) //加载ContentProvider资源
- raw(String rawPath) //加载raw资源
- asserts(String assertspath) //加载asserts资源
- thumbnail(float thumbnail)//缩略图
- rectRoundCorner(int rectRoundRadiusf) //形状为圆角矩形时的圆角半径
- priority(int priority) //优先级
- error(int errorResId) //错误占位图
- asSquare() //形状为正方形
- colorFilter(int color) //颜色滤镜
- diskCacheStrategy(DiskCacheStrategy diskCacheStrategy) //DiskCacheStrategy.NONE :不缓存图片 /DiskCacheStrategy.SOURCE :缓存图片源文件/DiskCacheStrategy.RESULT:缓存修改过的图片/DiskCacheStrategy.ALL:缓存所有的图片,默认
ignoreCertificateVerify(boolean ignoreCertificateVerify) // https是否忽略校验- asCircle()//加载圆形图片
- placeHolder(int placeHolderResId) //占位图
- override(int oWidth, int oHeight) //加载图片时设置分辨率 a
- scale(int scaleMode) // CENTER_CROP等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示 ; FIT_CENTER 等比例缩放图片,宽或者是高等于ImageView的宽或者是高 默认:FIT_CENTER
- animate(int animationId ) 引入动画
- animate( Animation animation) 引入动画
- animate(ViewPropertyAnimation.Animator animato) 引入动画
- asBitmap(BitmapListener bitmapListener)// 使用bitmap不显示到imageview
- into(View targetView) //展示到imageview
- colorFilter(int filteColor) //颜色滤镜
- blur(int blurRadius) //高斯模糊
- brightnessFilter(float level) //调节图片亮度
- grayscaleFilter() //黑白效果
- swirlFilter() //漩涡效果
- toonFilter() //油画效果
- sepiaFilter() //水墨画效果
- contrastFilter(float constrasrLevel) //锐化效果
- invertFilter() //胶片效果
- pixelationFilter(float pixelationLevel) //马赛克效果
- sketchFilter() // //素描效果
- vignetteFilter() //晕映效果
中转站–GlobalConfig
GlobalConfig类非常简单主要是选择Loader的操作,之所以用到这个类是因为方便以后扩展。今后我们如果需要使用其他的图片加载框架,只需要继承ILoader,然后在GlobalConfig中配置即可。
public class GlobalConfig {
public static void init(Context context, int cacheSizeInM,
getLoader().init(context, cacheSizeInM, memoryCategory, isInternalCD);
}
public static ILoader getLoader() {
if (loader == null) {
//这里只做了glide的封装
loader = new GlideLoader();
}
//可以接着做fresco或者picasso
return loader;
}
{
最终的执行者–GlideLoader
GlideLoader实现ILoader接口。在使用的时候我们虽然不用关心这个类,但是了解一下主要做了什么功能还是必要的。
GlideLoader中主要做了两件事,一个是初始化的实现,一个是出口方法的实现。
初始化的实现
我们在application中调用
ImageLoader.init(getApplicationContext());
会最终调用到下面这个方法,最终的操作都是在这里进行的
public class GlideLoader implements ILoader {
/**
* @param context 上下文
* @param cacheSizeInM Glide默认磁盘缓存最大容量250MB
* @param memoryCategory 调整内存缓存的大小 LOW(0.5f) / NORMAL(1f) / HIGH(1.5f);
* @param isInternalCD true 磁盘缓存到应用的内部目录 / false 磁盘缓存到外部存
*/
@Override
public void init(Context context, int cacheSizeInM, MemoryCategory memoryCategory, boolean isInternalCD) {
Glide.get(context).setMemoryCategory(memoryCategory); //如果在应用当中想要调整内存缓存的大小,开发者可以通过如下方式:
GlideBuilder builder = new GlideBuilder(context);
if (isInternalCD) {
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheSizeInM * 1024 * 1024));
} else {
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSizeInM * 1024 * 1024));
}
}
}
混淆
在proguard-rules中添加如下
-dontwarn okio.**
由于具体使用文章较长,具体如何使用详细API介绍请移步本人下一篇博客
Glide二次封装库的使用
http://blog.csdn.net/github_33304260/article/details/71077965
更多代码可以查询本人GitHub:欢迎阅读,star点起来。
Glide二次封装库源码
Glide二次封装库的使用的更多相关文章
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...
- 借鉴Glide思想二次封装Fresco
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲. 背景 Fresco 图片库很强大,我们项目中就是使用的 Fre ...
- Google图片加载库Glide的简单封装GlideUtils
Google图片加载库Glide的简单封装GlideUtils 因为项目里用的Glide的地方比较多,所有简单的封装了以下,其实也没什么,就是写了个工具类,但是还是要把基础说下 Glide的Githu ...
- 简单二次封装的Golang图像处理库:图片裁剪
简单二次封装的Golang图像处理库:图片裁剪 一.功能 Go语言下的官方图像处理库 简单封装后对jpg和png图像进行缩放/裁剪的库 二.使用说明 1.首先下载 go get -v -u githu ...
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...
- Protel封装库
一.目录下面的一些封装库中,根据元件的不同封装我们将其封装分为二大类:一类是分立元件的封装,一类是集成电路元件的封装 1.分立元件类: 电容:电容分普通电容和贴片电容: 普通电容在Miscellane ...
- AFNetworking3.0+MBProgressHUD二次封装,一句话搞定网络提示
对AFNetworking3.0+MBProgressHUD的二次封装,使用更方便,适用性非常强: 一句话搞定网络提示: 再也不用担心网络库更新后,工程要修改很多地方了!网络库更新了只需要更新这个封装 ...
- Android 一个改进的okHttp封装库
一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...
- 第一百三十节,JavaScript,封装库--连缀
JavaScript,封装库--连缀 学习要点: 1.连缀介绍 2.改写库对象 本章我们重点来介绍,在调用库的时候,我们需要能够在前台调用的时候可以同时设置多个操作,比如设置CSS,设置innerHT ...
随机推荐
- python(1)处理图像
一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此, ...
- [POI2009]KON-Ticket Inspector(二维前缀和+DP)
题意 有n个车站,现在有一辆火车从1到n驶过,给出aij代表从i站上车j站下车的人的个数.列车行驶过程中你有K次检票机会,所有当前在车上的人会被检票,问最多能检多少个不同的人的票 (n<=600 ...
- perl模块
查看perl模块安装目录:find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print 为什么要写或要模块呢?简言之:代码重用,更多见于写一组工具集,有很多地方是 ...
- CSU 1374 Restore Calculation 数位DP
题意: 给你三个数A, B, C(没有前导0),但是其中某些位不知道. 问A+B=C成立有多少种情况. 思路: 从最后一位往前推,枚举A, B的每一种情况,考虑进位和不进位两种情况. 代码: #inc ...
- 题解 P2330 【[SCOI2005]繁忙的都市】
又是一道Kruskal题目. AC代码见下. 主要思路就是将所有的边储存起来,然后进行贪心地选择,期间需要判断两个端点是否有关联,这一过程通过并查集实现.Kruskal部分套模板就可以了. #incl ...
- Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案
google搜到一篇文章:http://www.bdtool.net/blog_356.html 试了文章里的两个方法,方法一不行,方法二有点搞头,但是还有些错.试着试着,突然成功了~ 我是这么做的 ...
- 百度地图SDK for Android【Demo兴趣点搜索】
百度地图SDK为开发人员提供了便捷的检索服务. 今天我将为大家介绍Poi检索相关的内容. 首先,我们要构建一个最主要的地图应用.详细介绍请參考:百度地图SDK for Android[ ...
- windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)
郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...
- wcf rest系列文章
http://www.cnblogs.com/artech/archive/2012/02/15/wcf-rest.html 需要注意的是,发布的服务,可以在web behavior中指定显示help ...
- VC眼中的众筹平台:将改变VC募集基金方式,成为下一个纳斯达克市场
“一个好的投资平台可能会成为像纳斯达克一样的市场”,这是投资人给予众筹平台的未来憧憬. ”从长远的角度来说,众筹平台可能会改变VC募集基金的方式“,戈壁投资合伙人蒋涛说,“从二级市场看,不论是企业的I ...