android加载大图

2018-06-30  本文已影响0人  抱不住太阳的深海line

在项目中可能有这样一个需求,需要加载巨大的图片 并且还不允许压缩。比如显示:世界地图、清明上河图、微博长图等。

那么对于这种需求,该如何做呢?

首先不压缩,按照原图尺寸加载,那么屏幕肯定是不够大的,并且考虑到内存的情况,不可能一次性整图加载到内存中,所以肯定是局部加载,那么就需要用到一个类:

BitmapRegionDecoder

其次,既然屏幕显示不完,那么最起码要添加一个上下左右拖动的手势,让用户可以拖动查看。OK 下面讲一下基本的知识点。

BitmapRegionDecoder的基本用法

        BitmapRegionDecoder能用来解码一张图片的某个矩形区域,这个类一般用在图片过大而你又只需要该图片的一部分的时候。为了生成BitmapRegionDecoder对象,可以调用newInstance(...),得到BitmapRegionDecoder后,使用者可以反复调用decodeRegion来获得该图片的不同区域的解码得到的bitmap.

public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options)

解码该图片的一个矩形区域,该区域由rect决定,返回值为显示图像为该区域的bitmap,注意options中不能使用inPurgeable这个参数。

inPremultiplied参数

如果设置了true(默认是true),那么返回的图片RGB都会预乘透明通道A后的颜色系统View或者Canvas绘制图片,不建议设置为fase,否则会抛出异常,这是因为系统会假定所有图像都预乘A通道的已简化绘制时间.设置inPremultiplied的同时,设置inScale会导致绘制的颜色不正确.

public int getHeight (),public int getWidth ()    获取原图片的宽和高。下面通过一个例子进行深入的讲解

1、生成Bitmap对象

0.png

2、获得图片的宽高(一会边界检查会用到)

1.png

3、创建一个Rect (Rect类主要用于表示坐标系中的一块矩形区域,并可以对其做一些简单操作)

2.png

4、绘制

3.png

通过我们上面得到的BitmapRegionDecoder 对象 得到 bitmap 然后通过canvas画出来

5、触摸反馈(毕竟把一张大图只显示其中的一个区域然后它还不动 用户会骂娘)

这里我用了最简单的方法 重写了onTouchEvent方法

4.png

下面是整个自定义View的完整代码

5.png
上一篇下一篇

猜你喜欢

热点阅读