android 大图分块加载,超大图加载

超大图加载

一个1000 x 20000(宽1000px,高20000px)的大图,如何正常加载显示且不发生OOM ?

分析

当图片超出设备内存大小时,就会导致OOM。但是这么多漂亮的小姐姐,怎么能不加载出来呢?既然一次加载内存不够,我们就一次加载一部分,分区域去加载。

对于这种常见问题,Android已经提供了一些支持:BitmapRegionDecoder,图片区域加载类,帮助我们完成区域加载。

分区域加载。既然是区域加载,就要能传入一个区域去加载该部分图片。

手势滑动监听。图片这么大,当然要提供一种方式去移动显示的区域。使用手势滑动,滑到哪一块显示那一块。

自定义View。系统控件可定不满足需求。我们必须使用自定义View的知识。

实现

分区域加载

BitmapRegionDecoder.decodeRegion(mRect, mOptions)

使用decodeRegion()方法加载mRect内图片大小。

手势滑动监听

使用MoveGestureDetector,具体处理手势事件。

在滑动时,不断的更新滑动事件Event。

自定义View

覆写onTouchEvent()

在此方法中监听手势事件,记得边界处理。

覆写onMeasure()

获取到控件的大小,结合图片的大小,计算出要显示的区域存储到Rect中,在绘制时就利用此Rect去绘制。

覆写onDraw()

利用分区域加载的方法,拿到当前显示区域的Bitmap,使用canvas绘制到界面上。

效果

fcf514d81d5a

大图加载

后记

参考资料

待优化

每次滑动都会onDraw();

可以增加手势缩放;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值