当前位置: 首页 > news >正文

GLide加载图片还能这样干——基于Glide4.0完美封装

一个基于GLide加载图片的封装开源框架。可以监听加载图片时的进度 ,可以设置图片的圆角、边框。可加载成圆形。

来自孙福生一个开源框架。项目地址为:github.com/sfsheng0322…

该库是基于Glide V4.0设计的,实现如下特性:

  • 1、通过提供的属性可以设置图片的圆角、边框。
  • 2、可以设置点击触摸图片时的颜色、透明度。
  • 3、一行代码加载来自网络、res、SDCard中的图片,可加载成圆形。
  • 4、可以监听加载图片时的进度。

话不多说,上我们的我们的效果图:

项目预览

加载不同形式的图片:

public void loadLocalImage(@DrawableRes int resId, int placeholderResId) {
            load(resId, requestOptions(placeholderResId));
        }

        public void loadLocalImage(String localPath, int placeholderResId) {
            load(FILE + localPath, requestOptions(placeholderResId));
        }

        public void loadCircleImage(String url, int placeholderResId) {
            load(url, circleRequestOptions(placeholderResId));
        }

        public void loadLocalCircleImage(int resId, int placeholderResId) {
            load(resId, circleRequestOptions(placeholderResId));
        }

        public void loadLocalCircleImage(String localPath, int placeholderResId) {
            load(FILE + localPath, circleRequestOptions(placeholderResId));
        }复制代码

效果图:

加载不同风格的图片

一些关键的类:

  • GlideView 对ImageView进一步的封装

  • GlideImageLoader 对Glide.load的进一步封装

  • CircleProgressView和ShapeImageView 封装加载图片的进度条

CircleProgressView和ShapeImageView是自定义ImageView,其中封装了一些自定义属性
可以在可以在代码中设置图片的一些属性, 当然这些属性也可以在GlideImageView上面设置。

eg:

// 设置边框颜色
public void setBorderColor(@ColorRes int id) {
    this.borderColor = getResources().getColor(id);
    invalidate();
}

// 设置边框宽度
public void setBorderWidth(int borderWidth) {
    this.borderWidth = DisplayUtil.dip2px(getContext(), borderWidth);
    invalidate();
}

// 设置图片按下颜色透明度
public void setPressedAlpha(float pressAlpha) {
    this.pressedAlpha = pressAlpha;
}

// 设置图片按下的颜色
public void setPressedColor(@ColorRes int id) {
    this.pressedColor = getResources().getColor(id);
    pressedPaint.setColor(pressedColor);
    pressedPaint.setAlpha(0);
    invalidate();
}复制代码

具体属性如下

Attribute 属性Description 描述
siv_border_color边框颜色
siv_border_width边框宽度
siv_pressed_color触摸图片时的颜色
siv_pressed_alpha触摸图片时的颜色透明度: 0.0f - 1.0f
siv_radius圆角弧度
siv_shape_type两种形状类型:默认是0:rectangle、1:circle

代码:

 image41.load(cat_thumbnail, requestOptions).listener(new OnGlideImageViewListener() {
            @Override
            public void onProgress(int percent, boolean isDone, GlideException exception) {
                if (exception != null && !TextUtils.isEmpty(exception.getMessage())) {
                    Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
                }
                progressView1.setProgress(percent);
                progressView1.setVisibility(isDone ? View.GONE : View.VISIBLE);
            }
        });复制代码

加载gif:

加载gif小图片

GLide的缓存策略:

内存缓存

让我们想象一个非常简单的请求,从网络中加载图片到 ImageView。

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .skipMemoryCache( true )
    .into( imageViewInternet );复制代码

调用了 .skipMemoryCache(true) 去明确告诉 Glide 跳过内存缓存。这意味着 Glide 将不会把这张图片放到内存缓存中去。这里需要明白的是,这只是会影响内存缓存!Glide 将会仍然利用磁盘缓存来避免重复的网络请求

跳过磁盘缓存

图片在这段代码片段中将不会被保存在磁盘缓存中。然而,默认的它将仍然使用内存缓存!为了把这里两者都禁用掉,两个方法一起调用:

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .skipMemoryCache( true )
    .into( imageViewInternet );复制代码

自定义磁盘缓存行为

Picasso 仅仅缓存了全尺寸的图像。然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像。比如,如果你请求的一个图像是 1000x1000 像素的,但你的 ImageView 是 500x500 像素的,Glide 将会把这两个尺寸都进行缓存。

现在你将会理解对于 .diskCacheStrategy() 方法来说不同的枚举参数的意义:

  • DiskCacheStrategy.NONE 什么都不缓存,就像刚讨论的那样

  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像。在我们上面的例子中,将会只有一个 1000x1000 像素的图片

  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即,降低分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

用 DiskCacheStrategy.SOURCE 去告诉 Glide 仅仅保存原始图片:

Glide  
    .with( context )
    .load( eatFoodyImages[2] )
    .diskCacheStrategy( DiskCacheStrategy.SOURCE )
    .into( imageViewFile );        复制代码

在项目中提供了GlideImageLoader类加载图片,比如这样加载图片:先加载缩略图再加载高清图片,并监听加载的进度

private void loadImage(String image_url_thumbnail, String image_url) {
    RequestOptions requestOptions = glideImageView.requestOptions(R.color.black)
            .centerCrop()
            .skipMemoryCache(true) // 跳过内存缓存
            .diskCacheStrategy(DiskCacheStrategy.NONE); // 不缓存到SDCard中

    glideImageView.getImageLoader().setOnGlideImageViewListener(image_url, new OnGlideImageViewListener() {
        @Override
        public void onProgress(int percent, boolean isDone, GlideException exception) {
            progressView.setProgress(percent);
            progressView.setVisibility(isDone ? View.GONE : View.VISIBLE);
        }
    });

    glideImageView.getImageLoader().requestBuilder(image_url, requestOptions)
            .thumbnail(Glide.with(ImageActivity.this) // 加载缩略图
                    .load(image_url_thumbnail)
                    .apply(requestOptions))
            .transition(DrawableTransitionOptions.withCrossFade()) // 动画渐变加载
            .into(glideImageView);
}复制代码

加载进度时效果如下:

加载时进度条监听

项目Github链接地址

github.com/androidstar…

下载慢?CSDN下载链接:

download.csdn.net/detail/andr…

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

技术+职场

相关文章:

  • “朋友仅展示最近三天的朋友圈”的背后
  • WCF学习之: IsInitiating 和 IsTerminating
  • 数据结构与算法总结
  • Server.MapPath的用法
  • Zabbix 3.2.6监控虚拟机VMware
  • 01_04_Linux操作系统基础
  • Integer 内部缓存
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • Mysql性能基本测试
  • [Flex][问题笔记]TextArea滚动条问题
  • 逆向输出回环数组
  • 最近忙死了。。。
  • Caffe+Windows 环境搭建收集
  • 设计模式学习笔记--Façade外观模式
  • 自己动手,实现“你的名字”滤镜
  • [case10]使用RSQL实现端到端的动态查询
  • Fabric架构演变之路
  • If…else
  • JAVA之继承和多态
  • learning koa2.x
  • nodejs:开发并发布一个nodejs包
  • TypeScript迭代器
  • Vue全家桶实现一个Web App
  • 半理解系列--Promise的进化史
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 多线程 start 和 run 方法到底有什么区别?
  • 基于web的全景—— Pannellum小试
  • 检测对象或数组
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 那些年我们用过的显示性能指标
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 三栏布局总结
  • 小程序button引导用户授权
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 2017年360最后一道编程题
  • 如何用纯 CSS 创作一个货车 loader
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #HarmonyOS:基础语法
  • $.ajax()参数及用法
  • $refs 、$nextTic、动态组件、name的使用
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (十)c52学习之旅-定时器实验
  • (转)socket Aio demo
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET MVC之AOP
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 表达式计算:Expression Evaluator
  • .net 设置默认首页
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET下ASPX编程的几个小问题
  • .NET中GET与SET的用法