GLide加载图片还能这样干——基于Glide4.0完美封装
来源:互联网 发布:大学生网络教育平台 编辑:程序博客网 时间:2024/04/28 09:58
一个基于GLide加载图片的封装开源框架。可以监听加载图片时的进度 ,可以设置图片的圆角、边框。可加载成圆形。
来自孙福生一个开源框架。项目地址为:https://github.com/sfsheng0322/GlideImageView
该库是基于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();}
具体属性如下
代码:
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:
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链接地址
https://github.com/androidstarjack/MyCircleWaveDiverge
下载慢?CSDN下载链接:
http://download.csdn.net/detail/androidstarjack/9892366
相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
- GLide加载图片还能这样干——基于Glide4.0完美封装
- GLide加载图片还能这样干——基于Glide4.0完美封装
- GLide加载图片你这样玩过吗——基于Glide4.0完美封装
- Glide4.0加载https图片
- 一个基于GLide加载图片的封装开源框架
- Glide圆形图片加载封装
- 最新Android Glide4.0加载Gif图片到ImageView
- 【封装】图片加载框架Glide使用
- 居然还能这样——程序员加薪的新方法
- Glide —— 图片加载库
- 完美解决glide+StaggeredGridLayoutManager 图片加载大小不正常的问题
- 完美解决glide+StaggeredGridLayoutManager 图片加载大小不正常的问题
- 封装篇——图片模块(Glide)
- 浅谈Glide加载图片的框架和封装
- Glide图片加载框架学习及常用方法封装
- Google图片加载库Glide的简单封装GlideUtils
- Google图片加载库Glide的简单封装GlideUtils
- 用产品思维设计API(四)——随意定义错误码,你还在这样干?
- 不同的数据类型在32位和64位下所占字节的区别
- android指定数据库的路径
- 华科16_3
- Count and Say
- 转载---23种设计模式(场景需要决定使用模式,非为了用而用)
- GLide加载图片还能这样干——基于Glide4.0完美封装
- UVA
- 将kali linux装入U盘 制作随身携带的kali linux
- Java操作redis
- Windows下安装scipy
- MOOC清华《程序设计基础》第5章第3题:用递归算法求最大公约数
- 用Python爬取拉钩网招聘职位信息
- 模块化前端项目解决方案--带node版
- leetcode算法题3:分组,让每个组的最小者,相加之后和最大。想知道桶排序是怎么样的吗?