mipmap不同的文件夾下圖片的內(nèi)存占用

概括

上一篇文章提到進(jìn)行適配的時(shí)候,理想的情況是:針對不同密度的設(shè)備由設(shè)計(jì)提供不同的尺寸的圖片乏盐,分別放進(jìn)mipmap的不同文件夾下童谒,以實(shí)現(xiàn)基本一致的用戶體驗(yàn)乾翔。但是實(shí)際情況是多數(shù)公司都只會根據(jù)交互圖出一份切圖籽腕,我目前的項(xiàng)目也是這樣嗡呼。那么,此時(shí)問題就來了皇耗,圖片究竟該放在mipmap-mdpi南窗、mipmap-ndpi、mipmap-xndpi郎楼、mipmap-xxndpi万伤、mipmap-xxxndpi中的那個(gè)文件夾下呢?

之前我是直接把圖片放在mipmap-hdpi的文件夾下呜袁,不同的設(shè)備會自動(dòng)去到該文件夾下找相應(yīng)的圖片敌买,但是最近突然發(fā)現(xiàn)這樣做存在非常大的問題,因?yàn)椋?strong>相同的圖片放在不同的文件夾下在不同的設(shè)備上的內(nèi)存占用是不同的阶界。

具體我們來分析一下:
準(zhǔn)備的圖片參數(shù)為:1080*520px虹钮、32-bit color、文件大小373.32KB的圖片膘融,手機(jī)是魅藍(lán)note2芙粱,1920*1080px,尺寸為5.5英寸氧映,設(shè)備像素密度為3春畔。

圖-1.png

主界面

public class MainActivity extends AppCompatActivity {

    private ImageView imgView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imgView = (ImageView) findViewById(R.id.img);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        printImgWH();
    }

    private void printImgWH(){
        if (imgView==null){
            return;
        }
        Drawable drawable = imgView.getDrawable();
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        System.out.println("img width:"+bitmap.getWidth()+";img height:"+bitmap.getHeight());
    }
}

布局界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.zhl.mipmapdemo.MainActivity">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_group_bg"/>

</LinearLayout>

代碼比較簡單。我們分以下的幾種情況進(jìn)行驗(yàn)證:

情況1.首先不設(shè)置圖片岛都,運(yùn)行app后內(nèi)存占用律姨、圖片寬高:

圖-2.png
圖-3.png

結(jié)果:app占用內(nèi)存為17.47M,空閑內(nèi)存為2.67M.圖片(bitmap)寬高輸出0*0px

情況2.把圖片放在mipmap-xxhdpi文件夾下臼疫,運(yùn)行app后內(nèi)存占用择份、圖片寬高:

圖-4.png
圖-5.png

結(jié)果:app占用內(nèi)存為19.61M,空閑內(nèi)存為0.52M.圖片(bitmap)寬高輸出1080*520px

情況3.把圖片放在mipmap-mdpi文件夾下烫堤,運(yùn)行app后內(nèi)存占用缓淹、圖片寬高:

圖-6.png
圖-7.png

結(jié)果:app占用內(nèi)存為36.43M,空閑內(nèi)存為3.71M.圖片(bitmap)寬高輸出3240*1560px

情況4.把圖片放在mipmap-hdpi塔逃、mipmap-xhdpi、mipmap-xxxhdpi文件夾下料仗,運(yùn)行app后內(nèi)存占用湾盗、圖片寬高:

這三種情況我就不放截圖了。結(jié)果分別是:
hdpi:app占用內(nèi)存為25.72M立轧,空閑內(nèi)存為3.71M.圖片寬高(bitmap)輸出2160*1040px
xhdpi:app占用內(nèi)存為21.96M格粪,空閑內(nèi)存為3.77M.圖片寬高(bitmap)輸出1620*780px
xxxhdpi:app占用內(nèi)存為18.68M躏吊,空閑內(nèi)存為1.45M.圖片寬高(bitmap)輸出810*390px

情況5.把圖片放在mipmap-xxhdpi文件夾下,同時(shí)設(shè)置ImageView的寬高分別為1dp帐萎,運(yùn)行app后內(nèi)存占用比伏、圖片寬高:

圖-8.png
圖-9.png

結(jié)果:app占用內(nèi)存為19.83M,空閑內(nèi)存為0.30M.圖片(bitmap)寬高輸出3240*1560px疆导,圖片(ImageView)的寬高輸出為3*3px
注:此種情況是后面加的赁项,因此與情況2的結(jié)果有差異,理想情況下app占用內(nèi)存和空閑內(nèi)存應(yīng)與情況2一致澈段。

結(jié)果分析:
1悠菜、在同一設(shè)備上,相同的圖片放在設(shè)備像素密度越高的文件夾下败富,圖片輸出的寬高越小悔醋。且根據(jù)像素密度的關(guān)系,呈現(xiàn)3:2:1.5:1:0.75的比例關(guān)系兽叮。
2芬骄、在同一設(shè)備上,相同的圖片放在設(shè)備像素密度越高的文件夾下鹦聪,圖片占用的內(nèi)存越小账阻。
3、圖片在硬盤上的大小椎麦,與之在內(nèi)存中的大小沒有直接關(guān)系宰僧。
4、相同像素密度的文件夾下观挎,圖片加載到內(nèi)存中bitmap的大小不受ImageView大小的影響琴儿,即圖片占用的內(nèi)存大小與圖片(ImageView)的實(shí)際大小無關(guān),只與圖片的分辨率有關(guān)嘁捷。

我們以xxhdpi設(shè)備上得到的數(shù)據(jù)進(jìn)行計(jì)算內(nèi)存占用:
1080*520*4*8/8 byte造成,即2246.4kb,即2.2464M.所以理論計(jì)算此時(shí)占用的內(nèi)容更應(yīng)該為初始內(nèi)存加此內(nèi)存雄嚣,即17.47+2.2464=19.7164晒屎,與實(shí)際值19.61基本一致(在誤差范圍內(nèi))。

Android中bitmap的默認(rèn)Config為:ARGB_8888缓升,此config表示每個(gè)像素分別由A鼓鲁、R、G港谊、B四個(gè)通道表示骇吭,每個(gè)通道占8bit,所以每一個(gè)像素的大小為4*8=32bit歧寺,即4kb燥狰。

另外棘脐,圖片在硬盤存儲時(shí)表現(xiàn)的大小,與內(nèi)存中表現(xiàn)不一致龙致≈欤看到另外一篇博文(結(jié)尾附上)解釋的很詳細(xì),是這樣寫的:

存放在硬盤上的圖片文件目代,會根據(jù)各自的壓縮規(guī)則進(jìn)行壓縮屈梁,比如Jpeg這種有損壓縮的圖片格式,最常使用可變字長編碼的哈弗曼編碼像啼,會使用哈弗曼樹俘闯,也就是最優(yōu)二叉樹,根據(jù)某些數(shù)據(jù)出現(xiàn)的頻率對數(shù)據(jù)段編碼忽冻,從而減少占用的硬盤大小真朗。

比如說“10111”這個(gè)序列在圖片的二進(jìn)制數(shù)據(jù)中出現(xiàn)的概率最大,那我們可以用“01”來代替這一段數(shù)據(jù)僧诚,原來5位的數(shù)據(jù)遮婶,用2位就可以表示了,這就是壓縮率60%湖笨。當(dāng)然這只是打個(gè)比方旗扑,在實(shí)際操作中需要考慮“異前綴原則”等編碼的基本原則。

而如果把圖像讀取到內(nèi)存中就不一樣了慈省,因?yàn)槲覀冃枰恳粋€(gè)像素都能在屏幕上顯示臀防,所以會把每個(gè)像素點(diǎn)都加載至內(nèi)存中,不會對相同像素進(jìn)行壓縮或者是替換边败,所以你也應(yīng)該能明白前面提到的Bitmap占用內(nèi)存大小的計(jì)算公式的由來了袱衷。

結(jié)論

<p>Android設(shè)備加載圖片時(shí),它會首先去到與該設(shè)備像素密度一致的文件夾下找圖片笑窜,如果找不到致燥,他會依次到其他文件夾下去找,但是最終的顯示結(jié)果會進(jìn)行縮放排截,規(guī)則是根據(jù)設(shè)備像素密度和對應(yīng)文件夾的像素密度的反比縮放圖片嫌蚤。即當(dāng)訪問的文件夾的代表像素密度更大時(shí),圖片表現(xiàn)出來的寬高會更小断傲,內(nèi)存占用也會更小脱吱。</p>
所以,當(dāng)我們只能為app提供一套切圖時(shí)认罩,優(yōu)先的考慮是盡可能的提供最高設(shè)備像素密度下的切圖箱蝠,并放在相應(yīng)的文件夾下,即xxxhdpi設(shè)備下的切圖,其次考慮提供主流像素密度設(shè)備的切圖抡锈,目前我項(xiàng)目中提供的均為1920*1080px,xxhdpi下的切圖乔外。這種切圖在xxxhdpi設(shè)備下會進(jìn)行一定的縮小顯示床三,需要注意最終呈現(xiàn)效果。
</br>
參考鏈接:
http://blog.csdn.net/zhaokaiqiang1992/article/details/49787117

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杨幼,一起剝皮案震驚了整個(gè)濱河市撇簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌差购,老刑警劉巖四瘫,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欲逃,居然都是意外死亡找蜜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門稳析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洗做,“玉大人,你說我怎么就攤上這事彰居〕现剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵陈惰,是天一觀的道長畦徘。 經(jīng)常有香客問我,道長抬闯,這世上最難降的妖魔是什么井辆? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮画髓,結(jié)果婚禮上掘剪,老公的妹妹穿的比我還像新娘。我一直安慰自己奈虾,他們只是感情好夺谁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肉微,像睡著了一般匾鸥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碉纳,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天勿负,我揣著相機(jī)與錄音,去河邊找鬼。 笑死奴愉,一個(gè)胖子當(dāng)著我的面吹牛琅摩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锭硼,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼房资,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了檀头?” 一聲冷哼從身側(cè)響起轰异,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暑始,沒想到半個(gè)月后搭独,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廊镜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年牙肝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片期升。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惊奇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出播赁,到底是詐尸還是另有隱情颂郎,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布容为,位于F島的核電站乓序,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坎背。R本人自食惡果不足惜替劈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望得滤。 院中可真熱鬧陨献,春花似錦、人聲如沸懂更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沮协。三九已至龄捡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慷暂,已是汗流浹背聘殖。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奸腺。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓餐禁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親突照。 傳聞我的和親對象是個(gè)殘疾皇子坠宴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容