我們在開篇中說過 android 中圖片占用內(nèi)存的大小是由圖片本身的分辨率和像素格式還有圖片所在drawable 文件夾有關(guān)系,那么有時候我會有這樣的疑問:比如圖片很大,那么我把 imageview 寬高設(shè)置的很小,會不會節(jié)約一些內(nèi)存。一直以來我都有這個疑問,正好今天開始整理自己的圖片知識體系,那么就隨便做個測試好了。
我設(shè)計了一個對比,一個頁面里從上到下有6個 寬高不同的imageview,前3個 imageview 使用同一張 png 圖片,后3個 imageview 使用2張尺寸不同的 SVG 圖片,然后我們打印出此時 imageview 中 drawable 的實際寬高和占用內(nèi)存大小。
涉及圖片:
一張 PNG 圖: 72*72
2張 SVG 矢量圖: 24dp*24dp,48dp*48dp
6個 imageview
前3個 imageview 都時使用這張 PNG 圖片的
view寬高:match_parent*wrap_content,72px*72px,48dp*48dp
后3個 imageview 使用2張 SVG 圖,SVG1,SVG2
SVG1:24dp*24dp , SVG2:48dp*48dp
view寬高:50dp*50dp/SVG1,50dp*50dp/SVG2,10dp*10dp/SVG1
看下結(jié)果:

代碼很簡單,我就貼一下獲取寬高和內(nèi)存大小的代碼
// 獲取圖片寬高
Rect bounds = image.getDrawable().getCurrent().getBounds();
result = "寬:" + (bounds.right - bounds.left) + ",高:" + (bounds.bottom - bounds.top);
// 獲取 png 圖片占用內(nèi)存大小
Drawable drawable = image.getDrawable();
if (drawable instanceof BitmapDrawable) {
Bitmap bitmap = ((BitmapDrawable) image.getDrawable()).getBitmap();
result = result + "內(nèi)存:" + (bitmap.getAllocationByteCount() / 1024) + "KB";
} else {
result = result + "內(nèi)存:" + calculateSVGDrawableSize(drawable) + "KB";
}
// 獲取 SVG 矢量圖占用內(nèi)存大小
private float calculateSVGDrawableSize(Drawable drawable) {
Bitmap bitmap = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
}
return bitmap.getAllocationByteCount() / 1024;
}
結(jié)論
PNG 圖片部分:
我們修改 imageview 的大小并不會影響PNG圖片占用內(nèi)存大小,所以把 imageview 寫的小一點省內(nèi)存就是個錯覺,哈哈,我一直以來都有這個錯覺哈。所以說 png 圖我們能把分辨率做小就做小,真心吃內(nèi)存啊,
SVG 矢量圖部分:
同樣我們修改 imageview 的大小并不會SVG影響圖片占用內(nèi)存大小,需要注意的是 SVG 圖片實際的顯示分辨率是由SVG 的 xml文件中的 width/height 決定的,所以啊SVG 既然支持縮放,那我們就把寬高寫小了好了,這樣可以省內(nèi)存呀。
2張 SVG圖:
SVG1

SVG2
