专栏首页Phoenix的Android之旅如何加载一张超大高清图

如何加载一张超大高清图

这天小呼接到一个需求,要实现一个超大图片加载的功能。

"大图片加载容易做,可是这个需求要保证在不OOM的情况下能放大查看,还要能清晰展示,这得怎么呢?",愁眉苦脸的小呼说到。

"听说过BitmapRegionDecoder吗?"小A给小呼出了主意。

"这是个什么东西"

"听我给你细细说来..."

高清大图展示

通常在面试中经常会遇到大图片加载的问题,我们知道这种问题无非是两个点,

· 图片压缩 · 防止OOM

但是如果要加上支持手势放大,让放大后的图片还能清晰展示,常用的办法就不行了。比方要加载张世界地图,或者清明上河图,如果按一般流程加载完了,它在放大就看不到原图的细节了。

BitmapRegionDecoder

可能有些同学用过这个类,当需要展示图片的某一个区域的时候,可以用这个类指定Rect来加载这个区域。

回到上文,要解决"高清大图加载并支持放大查看"这个需求,可以用这个思路 · 按普通大图加载流程,先按屏幕大小压缩后加载图片 · 根据手势放大和拖动,动态计算屏幕当前能显示的图片的区域,再用BitmapRegionDecoder加载

因为是局部解析Bitmap,所以内存消耗的极限也只是与屏幕大小,所以跟普通图片加载的内存消耗相去无几。

Demo展示

小A封装了一个自订一个View,只要把它当做普通的ImageView使用,即使再大的图加载也没问题,还能支持ViewPager翻页,效果如下所示

本文分享自微信公众号 - Android每日一讲(gh_f053f29083b9),作者:Phoenix

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android基础-Bitmap加载

    Android开发中比较需要注意的是内存的消耗,而在平时开发中经常会遇到内存占用大的情况是对Bitmap的处理。 其中的基础之一是如何在保证不消耗过大内存的情况...

    PhoenixZheng
  • Android8.0的广播-熟悉的陌生人

    Android 8.0正式版上线到现在已经有一年了,很多厂商的2018年的机型上已经用上了这个系统。

    PhoenixZheng
  • 面试经常被问到的Interface的坑

    曾经有一次面试被问到一个问题,Java的接口中能否定义一个非静态变量。当时我就懵了,一直只知道接口变量一定是静态,但从来没思考过为什么。不知道你有没有思考过这个...

    PhoenixZheng
  • 一文让你读懂Java类加载机制!

    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类...

    Java_老男孩
  • 3分钟速读原著《深入理解Java虚拟机》(一)

    cwl_java
  • 图解Tomcat类加载机制

      说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷。   之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,...

    用户1154259
  • 从微信、钉钉等APP,看六种常见的loading 加载设计

    当页面的框架固定时,只需要加载框架内数据时,采用这种刷新样式,即先加载框架,再加载框架内的数据。为了反之框架内的内容为空,会用占位符或者预设图片来填充。 上面简...

    企鹅号小编
  • 性能优化总结(四):预加载的设计

        本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为...

    用户1172223
  • 类加载器详解

    内容:转自 java知音 类加载器是负责将可能是网络上、也可能是磁盘上的class文件加载到内存中。并为其生成对应的java.lang.class对象。一旦一...

    用户1257393
  • JVM真香系列:轻松理解class文件到虚拟机(下)

    上面我们自定义一个String出了问题,问题在于JVM不知道我们想用哪个类,于是JVM就定义了个规范。

    田维常

扫码关注云+社区

领取腾讯云代金券