在项目中可能有这样一个需求,需要加载巨大的图片 并且还不允许压缩。比如显示:世界地图、清明上河图、微博长图等。
那么对于这种需求,该如何做呢?
首先不压缩,按照原图尺寸加载,那么屏幕肯定是不够大的,并且考虑到内存的情况,不可能一次性整图加载到内存中,所以肯定是局部加载,那么就需要用到一个类:
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对象
2、获得图片的宽高(一会边界检查会用到)
3、创建一个Rect (Rect类主要用于表示坐标系中的一块矩形区域,并可以对其做一些简单操作)
4、绘制
通过我们上面得到的BitmapRegionDecoder 对象 得到 bitmap 然后通过canvas画出来
5、触摸反馈(毕竟把一张大图只显示其中的一个区域然后它还不动 用户会骂娘)
这里我用了最简单的方法 重写了onTouchEvent方法
下面是整个自定义View的完整代码