app项目开发过程中,大都有查看图片详情的功能模块。实现的方式一般都是通过viewpager+photoView+Glide的方式。这种方式下,如果碰到加载超长图,比如说高清版的清明上河图/世界地图,肯定就加载不出来了。
系统会提示如下异常:
log的意思就是图片太大了。这个时候BitmapRegionDecoder就派上了用场了。
android开发文档的解释是BitmapRegionDecoder允许从图片扣取一个图块加载,这就能很好的加载高清长图也能有效的防止内存溢出了。
SubsamplingScaleImageView就是基于BitmapRegionDecoder封装的开源框架。
GitHub地址:https://github.com/davemorrissey/subsampling-scale-image-view.git
现在问题来了,我们要在原有viewpager+photoView+Glide的基础上加上SubsamplingScaleImageView。photoView+Glide的方式能加载普通图和GIF图,SubsamplingScaleImageView是基于BitmapRegionDecoder,不能加载GIF图。(如果需要加载超大/帧数比较多的GIF,需要另找算法处理)
关键代码如下:
1.根据图片url后缀判断图片是否GIF图,如果是GIF图,执行GIF图的加载策略;
2.普通图片先通过Glide加载得到Bitmap的宽/高,如果高度超过了定义的MaxSize或者宽高比超过了MaxScale,就认为是超长图,需要通过SubsamplingScaleImageView去显示。为了使超长图平铺满屏幕的宽度从(0,0)点开始显示,我们需要计算zoom的scale的size。
计算方式如下:
3.普通非超长图 就简单了直接通过photoView去显示。
Demo GitHub地址:https://github.com/gongchaobin/GlideLargePicDemo.git