先看下效果图
实现原理
思路就是利用BitmapRegionDecoder加载巨图的部分,不全部加载整张巨图,然后对拖动,缩放,双击等进行处理,更改BitmapRegionDecoder所需要的Rect的大小,就搞定了。
代码实现
在构造函数里进行初始化,创建手势识别器等
private void init() {
mOptions = new BitmapFactory.Options();
mScroller = new Scroller(getContext());
mMatrix = new Matrix();//用于缩放的矩阵
mRect = new Rect();
//手势识别
mGestureDetector = new GestureDetector(getContext(), this);
mScaleGestureDetector = new ScaleGestureDetector(getContext(), this);
}
加载大图,我们这里以传进来的大图数据为InputStream为例,首先利用inJustDecodeBounds = true加载大图的宽高信息,获取完大图的宽之后,我们将inJustDecodeBounds设置为false,这样下次加载的时候就会真正加载大图了,因为是大图,我们将BitmapFactory.Options的图片加载格式设置为RGB_565,RGB_565相比ARGB_8888内存节省了一半,降低OOM的风险,如果图片有透明度的话,那还是的使用ARGB_8888。最后我们创建一个BitmapRegionDecoder的实例。
//设置大图
public void setImage(InputStream inputStream) {
mOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, mOptions);
mImageWidth = mOptions.outWidth;
mImageHeight = mOptions.outHeight;
mOptions.inPreferredConfig = Bitmap.Config.RGB_565;//RGB_565比ARGB_8888节省一半内存开销
mOptions.inJustDecodeBounds = false;
try {
mRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
} catch (IOException e) {