android圖片系列 (3) - imageview的尺寸與圖片內(nèi)存占用的關(guān)系

我們在開篇中說過 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é)果:

device-2017-06-25-225211.png

代碼很簡單,我就貼一下獲取寬高和內(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


Snip20170630_2.png

SVG2


Snip20170630_4.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容