更多代码可以查询本人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中重写以下方法:

    @Overridepublic 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线程中调用)

github项目地址

图片的各种设置信息–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() //晕映效果

github项目地址

中转站–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二次封装库源码

转载于:https://www.cnblogs.com/zhujiabin/p/7281722.html

Glide二次封装库的使用相关推荐

  1. linux c sftp二次封装库

    前言 本项目是基于linux c ssh.openssl标准库来开发sftp软件通信模块 本项目是对ssh.openssl标准库进行一个高层封装,使得可以在 Linux 上非常容易的执行调用,方便开发 ...

  2. 基于Glide的二次封装

    更多代码可以查询本人GitHub:欢迎阅读,star点起来. Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支持 ...

  3. Android基于Glide的二次封装,借鉴Glide思想二次封装Fresco

    最近封装了个 fresco 的组件库:dfresco,就顺便来讲讲. 背景 fresco 图片库很强大,我们项目中就是使用的 fresco,但有一点就是,不怎么好使用,略麻烦.不同项目中,多多少少都需 ...

  4. Google图片加载库Glide的简单封装GlideUtils

    Google图片加载库Glide的简单封装GlideUtils  

  5. conan入门(二十):封装只包含头文件(header_only)的库示例

    conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...

  6. 8、合宙Air模块Luat开发:基于官方库的二次封装,使串口更加易用

    目录 点击这里查看所有博文 本系列博客,理论上适用于合宙的Air202.Air268.Air720x.Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持). 先不管支不支持,如果 ...

  7. Retrofit网络加载库二次封装支持RxJava与Flow-HttpUtils

    Retrofit网络加载库二次封装支持RxJava与Flow-HttpUtils HttpUtils是Retrofit网络加载库二次封装支持RxJava与Flow,包含网络加载动画.activity销 ...

  8. 建立自己的封装库(二)

    前面已经建立好了我们自己的库,那么接下来是怎么画原理图和pcb封装了,其实大部分元件的封装网上都有很多,只不过有时有些项目需要用到的可能网上比较难找,或者对于网上找的不满意,那么没关系,学习学习怎么画 ...

  9. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装

    概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...

最新文章

  1. 从一道面试题分析Thread.interrupt方法
  2. 把ASP应用中的Session传递给asp.net应用
  3. 建筑师 第一类斯特林数
  4. IDEA对tomcat远程debug
  5. js用户密码强度验证函数
  6. Proxy(代理,拦截器),Reflect(反射)
  7. oracle数据设置为ull,Oracle _11g_使用手册_自备
  8. android多版本打包,Android的持续化集成及多版本打包
  9. Atitit.减少http请求数方案
  10. angularjs实现复选框赋值传参提交表单
  11. 力扣96.不同的二叉搜索树
  12. 【网络--实验】华三防火墙命令行调试实例
  13. linux--常用命令
  14. 真真正正解决VScode不能安装插件问题、无法连接到应用商城问题
  15. [收藏]基于Spark Graphframes的社交关系图谱项目实战
  16. Android BLE蓝牙踩坑总结
  17. 限速linux c语言,基于Linux系统的流量控制程序的C语言代码
  18. Matlab设计简易计算器
  19. Java 中的 getResource 方法
  20. Java毕设项目大学生创业众筹系统(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. 2022-2028年中国炼钢行业市场研究及前瞻分析报告
  2. xp系统蓝屏代码7b_电脑蓝屏重启不求人!学会这个方法,自己就能轻松解决!...
  3. Go 知识点(02)— channel 使用不当导致的 deadlock
  4. 2022-2028年中国丙烯酸酯橡胶行业市场深度分析及投资前景分析报告
  5. 难忘的一天——装操作系统(一)
  6. 机房收费系统【VB版】——前期准备
  7. linux 虚拟环境
  8. 从 SGD 到 Adam —— 深度学习优化算法概览 各种优化器 重点
  9. word2vec 中的数学原理详解(二)预备知识
  10. H.265视频编码与技术全析(上)