超大图加载

一个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绘制到界面上。

效果

大图加载

后记

参考资料

待优化

每次滑动都会onDraw();

可以增加手势缩放;

android 大图分块加载,超大图加载相关推荐

  1. android高德地图瓦片,高德地图加载瓦片分析

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ##了解瓦片地图 瓦片地图:瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的 ...

  2. 【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )

    文章目录 一.BitmapRegionDecoder 简介 二.图片信息 三.BitmapRegionDecoder 对象创建 四.解码图像 五.图像区域解码示例 六.源码及资源下载 一.Bitmap ...

  3. android 大图 分块,android 大文件分割上传(分块上传)

    由于android自身的原因,对大文件(如视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 p ...

  4. Android 长图大图加载

    长图大图加载 文章目录 长图大图加载 1.长图加载 1.1画出图形 1.2滑动图形 1.3惯性滑动图形 1.4 长图加载所有代码,以及展示 2.大图加载 3.大图缩放 需求:在项目开发中需要长图显示以 ...

  5. android 展示大图,Android 加载超大图(原图)分析

    众所周知,Android的ImageView不支持加载大图(高分辨率),会直接报错,如果不是特别大的图片,也可以选择使用WebView来加载,并且直接可以实现手势方法缩小平移等效果,但是如果图片特别长 ...

  6. Android 加载超大长图及原理

    Android 加载超大长图及原理 我们在开发中偶尔会遇到加载超大长图,类似于微信n多页聊天记录截图加载.但这类图片一般都会很大,几兆.十几兆.甚至几十兆,很容易造成内存溢出,今天笔者给大家提供一个可 ...

  7. Android 高清加载长图或大图方案

    不过值得一提的是:上面这个手势检测的写法,不是我想的,而是一个开源的项目https://github.com/rharter/android-gesture-detectors,里面包含很多的手势检测 ...

  8. Android 大图加载显示

    Android 大图加载显示 文章目录 Android 大图加载显示 通过本文你能学到什么? 一.ImagerView直接放置一张几十M的图片会崩溃吗? 二.如何保证加载大图不发生崩溃? 三.Glid ...

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

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处:  http://blog.csdn.net/lmj623565791/article/details/49300989:  本文出自: ...

最新文章

  1. ThinkPHP如何判断一个更新操作是否成功
  2. 安卓手机管理器_@你,请查收这款最强的安卓文件管理器
  3. Java HashMap的死循环
  4. Java 截取反斜杠--java使用split拆分特殊字符
  5. 操作系统 系统开销比率_操作系统中的最高响应比率下一个(HRRN)调度
  6. 基于PHP实现一个简单的在线聊天功能(轮询ajax )
  7. client mysql 逗号_Mysql-Client编码问题
  8. [原创]jQuery插件Realtime-Modifier正式发布!
  9. java数组转为字符串_join()和toString()方法 将数组转换为字符串
  10. 在vue 中使用Stylus
  11. EA(Enterprise Architecture,企业架构)
  12. JS 简易控制台插件 [供 博客, 论坛 运行js用]
  13. Python爬取网页数据
  14. 勒让德函数C语言编程设计,用递归方法求n阶勒让德多项式的值
  15. PDF文件怎么旋转页面
  16. [Zookeeper] 安装and各 配置参数详解
  17. 批量修改文件夹下所有文件的名称
  18. java仿QQ聊天室群聊(快速写一个简易QQ)
  19. 广告点击率预测问题初探
  20. 云原生分布式操作系统营造法式-云平台提供商视角

热门文章

  1. 防火墙与入侵检测系统
  2. 键盘移动小div(js原生)
  3. 【Reward is enough】Sutton、DavidSilver师徒联手:奖励机制足够实现各种目标。
  4. 最安全的微信群管理工具推荐
  5. netopeer-manager手册翻译
  6. windows输入法输入英文字母中间有空格
  7. ES6之三个点(扩展运算符及rest运算符)
  8. 如何判断某个物体当前是顺时针还是逆时针旋转
  9. C#重点知识详解(转)
  10. windows/ps使用技巧