先把结论放在前面:大图与长图的问题不是"怎么显示",而是"怎么不把整张图读进内存"。一张 3000×20000 的长图,即使按ARGB_8888也超过 200 MB,任何设备都放不下。解法只有一个:不解码整张图,只解码当前需要的区域。 这就是区域解码(BitmapRegionDecoder)与分块加载(BitmapTileDecoder)两套机制。
面试里这题属于"图片专题的进阶部分"。答得浅的是"用BitmapRegionDecoder局部解码";答得深的是能讲清两种解码器的分工与限制、为什么BitmapRegionDecoder在较新版本被标记为不推荐、inSampleSize与区域解码的组合策略,以及长图手势联动时的解码时机与缓存设计。
两种区域解码机制的分工
| 机制 | 适用 | 输入 | 输出 | 状态 |
|---|---|---|---|---|
BitmapRegionDecoder | 超大图(超过屏幕数倍) | 只能是单个文件的连续编码 | 一块区域位图 | 部分版本已标记不推荐 |