×
广告

Android使用Glide加载超长图

96
gongcb
2018.08.25 10:35 字数 443

     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

随笔
Web note ad 1