先看效果图:
而且手机端和电脑端都可以通过相同的方式实现这个效果,核心逻辑都是先加载一张放大的缩略图,将其进行模糊处理,同时加载大图并添加一个监听,当大图加载完成的时候,将小图替换成大图。
这里我们直接使用 Glide 图片加载框架。
先简单的写个布局:
1 | <?xml version="1.0" encoding="utf-8"?> |
单独封装一个 BlurImageLoader
类来实行图片模糊加载。(其实可以很简洁的,但是我看要传入的参数太多,再则为了试试之前的看的 Builder 设计模式,这里简单封装了一下,其实真的是画蛇添足,傻逼了,也不想改了 T T)
1 | public class BlurImageLoader { |
核心代码就是 Loader()
方法了,其中:
.bitmapTransform(new BlurTransformation(mContext, 5))
这个新建类就是模糊的关键了。
他是我从 glide-transformations 这个强大的 Glide 加载方式辅助工具中的一个类中摘取出来的。
这个类 BlurTransformation
:
1 | /** |
他有多种构造方式,常用的就是上面用到的,第一个传入上下文,第二次传入一个 int
值,这个 int
值代表图片的模糊程度。
对模糊程度没有概念的可以看这个网站,自己调整感受一下。
BlurTransformation
类中对 VERSION_CODES
进行判断,大于 18 的采用 RSBlur
进行模糊处理,也就是安卓自带的 ScriptIntrinsicBlur
类。
1 |
|
小于 18 的采用被广为使用的 FastBlur
类:
1 | import android.graphics.Bitmap; |
获取到了被模糊处理过后的缩略图之后,回到之前的 Loader()
方法中,我们重写了 onResourceReady()
,也就是当缩略图加载完成时,我们将该 resoure
(注意这里的 resource
是已经被模糊处理过后的)放到再次调用 Glide图片加载的 .placeholder(resource)
中,当做是第二次加载图片的占位符。这里添加了一个 Glide 自带的过渡动画效果 .crossFade()
渐显。那么当大图加载完成的时候就会成功的替换之前的模糊小图了。
为了试验效果,我们给两个按钮添加点击事件:
1 | mIvLoad1 = (ImageView) findViewById(R.id.iv_load); |
因为 Glide 自带的缓存效果,所以我们必须清除磁盘和内存的缓存:
1 | public boolean clearCacheDiskSelf() { |
哦,对了,我们要有图片来源才能实验啊,加载一张图片我们需要一张大图和一张小图,这里我的资源是随便打开了一个 Medium 网站上的网页使用浏览器的元素检查功能,然后直接复制了 url
:
我弄了两张图的资源,也就是四张图,为了加载快一点,将其放到了我自己的七牛云中,下面是资源地址:
1 | private String blurImageUrl1 = "http://on9hzfn6s.bkt.clouddn.com/zhanglffffff.jpeg"; |
然后就大功告成了(之前的效果图故意延时了一秒,这个是没有延时的)。