思路:那就是对于一张巨型图片我们可否每次指定一块区域加载显示,然后通过改变这个区域完成整张巨图的加载呢?这样内存中只有完整图片的一块区域。

区域加载

1、BitmapRegionDecoder
指定Bitmap区域进行解码,主要用于显示图片的某一块矩形区域
显示图片的某一块区域,那么至少需要两个方法:1、设置图片,2、设置显示区域。

接下来通过自定义一个可以加载巨图的View展开说明:

2、设置图片

前面说到至少需要两个方法:1、设置图片 2、指定显示区域

我们先来看如何设置图片:
mOptions实际就是BitmapFactory.Options,设置inJustDecodeBounds为ture(只解码图片的尺寸)。然后得到图片宽高,并且设置Bitmap是可以被复用的。然后创建BitmapRegionDecoder的实例对象。最后调用requestLayout()方法,reqeustLayout会重新测量我们的布局也就是会执行View的onMeasure()。

3、指定显示区域

在onMeasure方法中我们需要指定要加载图片的区域Rect的四个顶点位置。

由于我们不需要对Bitmap的的位置重新摆放,所以不许要重写onLayout方法,但是自定义View要绘制一张图片该怎么办?想必大家能够猜到:


首先设置Bitmap的复用,然后根据指定区域以及Options来解码一张图片,最后通过Canvas绘制到View中。

说道这里我们就将一张巨型图片的某个区域显示到View中了。但是我们仅仅显示了指定区域,而且是较小的一部分区域,如果想要完整预览整张图片该如何处理呢?

四、改变区域完成巨图加载

1、Scroller + GestureDetector

上面说到我们通过Rect指定显示区域,那通过改变要显示的区域位置不就可以完成整张图片的加载了?

所以借助手势GestureDetector与Scroller(滑动帮助)来完成这一功能。

首先我们将事件交由GestureDetector处理:

在GestureDetector的onScroll方法中:

重新指定上下两个顶点位置,然后调用invalidate进行重新绘制。

在GestureDetector的onFling方法:

指定手指离开的后的滑动惯性。

如果手指按下,此时我们希望停止滑动:

重写View的computeScroll计算View如何滑动:

通过BitmapRegionDecoder每次只加载显示一块区域的Bitmap,然后配合GestureDetector与Scroller完成手势滑动改变Rect完成View的滑动效果。至此如何加载显示一张巨图就实现了。

android如何加载长图相关推荐

  1. Android加载长图滑动显示

    1.记录下学到的Android加载长图写法以备后用 首先准备一张长图.这里把图片先放到项目的 assets文件夹下:命名为big.png 然后开始自定义显示长图的view :BigView impor ...

  2. android 漫画加载方案,Android加载长图的多种方案分享

    背景介绍 在某些特定场景下,我们需要考虑加载长图的需求,比如加载一幅<清明上河图>,这个好像有点过分了,那就加载1/2的<清明上河图>吧... 那TMD还不是一样道理. 言归正 ...

  3. Android之SubsamplingScaleImageView加载长图不能放缩问题

    1 问题 第三方开源框架用了这个第三方开源框架(SubsamplingScaleImageView)加载长图,但是源代码在有些手机上面不能进行放缩. private void displayLongP ...

  4. Android加载长图,仿微博长图滚动查看

    /** * Created by sunrui on 2017/3/8. * 加载长图片 * 解决步骤 * 1.将图片缩放到与控件等宽 * 2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置 ...

  5. android加载长图宽度自适应,Android使用Glide加载超长图

    app项目开发过程中,大都有查看图片详情的功能模块.实现的方式一般都是通过viewpager+photoView+Glide的方式.这种方式下,如果碰到加载超长图,比如说高清版的清明上河图/世界地图, ...

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

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

  7. 性能优化(四)长图优化,仿微博加载长图方式

    长图优化 现在市面上 95 % 以上,APP 都有预览图片的功能,那么是怎么做的勒,今天我们就来仿照 微博 预览长图,来对长图优化. 怎么使用 1.project/build.gradle allpr ...

  8. Android图片加载--妹子图客户端

    图片加载是几乎每个客户端都要用到的功能,这几天闲来无事,以妹子图客户端为例学习了一下android的图片加载.现在整理一下,一来便于自己理解记忆,二来和同样希望学习这方面知识的同学交流,三来贴出自己的 ...

  9. android动态加载背景,Android六种加载动态图的方式(包括动态背景和加载动态图片)之四...

    参考文章:http://www.cnblogs.com/firecode/archive/2012/11/01/2749774.html 其实这篇文章已经写的很全面,我只是用了一下将它加入到我的dem ...

最新文章

  1. arraylist 后往前遍历_Java集合框架之ArrayList
  2. redis常用命令getex_Redis常用命令(key、string、List)
  3. button按钮跳转JS代码
  4. 日志级别 debug info warn eirror fatal
  5. 第一届LCI workshop @ ICCV 2019, 欢迎投稿
  6. DynamoRIO工作原理
  7. 实验8.2 队列类的定义与实现
  8. 20muduo_base库源码分析(十一)
  9. java并发编程(二)synchronized
  10. ADO BUG之'无法为更新定位行....' 解决之道
  11. java并发程序死锁检测_Java并发:隐藏的线程死锁
  12. SSH框架搭建和整合(struts2、spring4、hibernate5)
  13. PHP, 将 PDF/Word/PPT 文档转换成图片生成长图
  14. mysql误删除恢复
  15. 【最优方案】合唱队形
  16. 文件查找工具Everything的使用技巧
  17. P9065 [yLOI2023] 云梦谣 题解
  18. 用例测试(三)——边界值分析法
  19. android官方上拉加载,Android-RecycleView上拉加载更多
  20. Oracle 实验一:Oracle11g的安装与管理工具

热门文章

  1. 企业内部培训——华微软件的培训制度
  2. open-dingtalk和nginx 做内网转发
  3. 基于改进的K-means算法在共享交通行业客户细分中的应用
  4. SQL与SQL Server的区别
  5. 【原创】从头开始,使用安卓系统WebView做一个功能强大的Epub阅读器(四)
  6. 机电一体化计算机接口一般分为,机电一体化中的接口技术
  7. QuantFabric量化交易系统开源发布
  8. 网亚机房管理软件系统 v6.0.9.1 免费
  9. matlab对信号进行AM调制与解调(仿真)
  10. 商务汇报PPT制作的七堂课-第四课:文字美化