巨图加载之BitmapRegionDecoder,防止OOM

先看下效果图

实现原理

思路就是利用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) {
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值