前言
BitmapRegionDecoder类是Android系统提供的用来操作超大图片的工具类,它能够根据用户指定的区域大小部分加载图片数据。我们知道Android里的图片加载是有要求的,必须要小于某个特定阈值,如果图片尺寸特别大解析到内存中就会超出这个阈值导致图片无法加载,BitmapRegionDecoder类能够很好的辅助开发者在手机小屏幕上展示超大尺寸图片。
实现效果
实现过程
先从网络上下载一份超大的《千里江山图》,直接作为图片资源设置到ImageView对象上,测试手机N5展示空白,并且在日志区提示如下日志,也就是说图片文件尺寸太大无法直接加载到内存中。
Bitmap too large to be uploaded into a texture (25245x1000, max=4096x4096)
现在使用自定义的ImageView控件来分块加载大图的部分,每次只加载不大于控件大小的部分来展示,通过监听用户在屏幕上的拖动来更新当前展示窗口里的图片部分,这样就好像把整幅图片都加在到内存中了。
在自定以的大图展示控件初始化时先定义BitmapRegionDecoder工具对象,这里把大图片资源放入到assets目录中,就可以通过InputStream输入流来读取图片数据。接着通过设置BitmapFactory.Options来只读取图片的长宽而不读取数据,记录下当前图片的实际尺寸。
public LargeImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
try {
InputStream inputStream = context.getAssets().open("long_picture.jpg");
// 初始化BitmapRegionDecoder
mDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options options = new</