超大图加载

作者: javaBoy_hw | 来源:发表于2018-07-01 17:17 被阅读430次

    超大图加载

    一个1000 x 20000(宽1000px,高20000px)的大图,如何正常加载显示且不发生OOM ?

    分析

    当图片超出设备内存大小时,就会导致OOM。但是这么多漂亮的小姐姐,怎么能不加载出来呢?既然一次加载内存不够,我们就一次加载一部分,分区域去加载。

    对于这种常见问题,Android已经提供了一些支持:BitmapRegionDecoder,图片区域加载类,帮助我们完成区域加载。

    • 分区域加载。既然是区域加载,就要能传入一个区域去加载该部分图片。
    • 手势滑动监听。图片这么大,当然要提供一种方式去移动显示的区域。使用手势滑动,滑到哪一块显示那一块。
    • 自定义View。系统控件可定不满足需求。我们必须使用自定义View的知识。

    实现

    分区域加载

    BitmapRegionDecoder.decodeRegion(mRect, mOptions)
    

    使用decodeRegion()方法加载mRect内图片大小。

    手势滑动监听

    使用MoveGestureDetector,具体处理手势事件。

    在滑动时,不断的更新滑动事件Event。

    自定义View

    覆写onTouchEvent()

    在此方法中监听手势事件,记得边界处理。

    覆写onMeasure()

    获取到控件的大小,结合图片的大小,计算出要显示的区域存储到Rect中,在绘制时就利用此Rect去绘制。

    覆写onDraw()

    利用分区域加载的方法,拿到当前显示区域的Bitmap,使用canvas绘制到界面上。

    效果

    大图加载

    后记

    参考资料

    1. Android 高清加载巨图方案 拒绝压缩图片

    待优化

    • 每次滑动都会onDraw();
    • 可以增加手势缩放;

    相关文章

      网友评论

      • 琴梨梨:然而实际上还可以考虑让app进程吃掉更多内存,用native层来加载。加载1080x22400的图实测只占用了1.2G内存,在3G内存的设备上一切正常
        javaBoy_hw:@琴梨梨 是个不错的思路。有参考文章或详细的方案没?
      • 一个冬季:😂我以为有代码
        javaBoy_hw:没有GitHub的价值,我传到百度网盘了,可以下载。更新下文章。
        一个冬季:@javaBoy_hw 可以,你可以抽空上传到gitHub上么?这样大家都可以看了
        javaBoy_hw:@一个冬季 代码不难的,需要的话,可以给你发一下。

      本文标题:超大图加载

      本文链接:https://www.haomeiwen.com/subject/quqhuftx.html