假设我在磁盘上有一点大(即不适合大多数手机的内存)位图.我想以一种不缩放的方式在屏幕上绘制部分内容(即inSampleSize == 1)
有没有办法加载/绘制我想要的部分给定一个Rect指定区域而不加载整个位图内容?
我非常有信心这是可能的,因为你可以将一个非常大的位图文件加载到ImageView没有问题的所以必须有某种内置的方法来处理大型位图...并且在几次尝试之后,我发现了一个办法:
而不是加载整个位图并自己手动绘制,Drawable而是将其加载为:
InputStream mapInput = getResources().openRawResource(
R.drawable.transit_map);
_map = Drawable.createFromStream(mapInput, "transit_map");
_map.setBounds(0, 0, _mapDimension.width(), _mapDimension.height());
Run Code Online (Sandbox Code Playgroud)
我正在使用资源文件,但由于您可以使用Drawable.createFromStream从任何加载图像InputStream,它应该适用于任意位图.
然后,使用该Drawable.draw方法将其绘制到所需的画布上,如下所示:
int left = -(int) contentOffset.x;
int top = -(int) contentOffset.y;
int right = (int) (zoom * _mapDimension.width() - contentOffset.x);
int bottom = (int) (zoom * _mapDimension.height() - contentOffset.y);
_map.setBounds(left, top, right, bottom);
_map.draw(canvas);
Run Code Online (Sandbox Code Playgroud)
与上面的情况一样,您也可以通过操纵drawable的边界来缩放和转换位图,只有位图的相关部分才会被加载并绘制到Canvas.
结果是只有一个200KB位图文件的可缩放缩放视图.我还用22MB的PNG文件对它进行了测试,OutOfMemoryError当屏幕方向发生变化时,它仍然可以正常工作.
| 归档时间: |
|
| 查看次数: |
4946 次 |
| 最近记录: |