Android 你還在為圖片放哪兒糾結嗎?圖片資原始檔夾載入規律
學而不思則罔,思而不學則殆
Android 你還在為圖片放哪兒糾結嗎?圖片資原始檔夾載入規律
引言
市面上Android機型五花八門,因此開發的時候的UI設計稿理論上需要提供所有的螢幕密度對應的素材。
如下是畫素密度和對應的資原始檔夾。
Type | file | dpi | Picture |
---|---|---|---|
ldpi | drawable-ldpi | 0.75 | 75px*75px |
mdpi | drawable-mdpi | 1 | 100px*100px |
hdpi | drawable-hdpi | 1.5 | 150px*150px |
xhdpi | drawable-xhdpi | 2 | 200px*200px |
xxhdpi | drawable-xxhdpi | 3 | 300px*300px |
xxxhdpi | drawable-xxxhdpi | 4 | 400px*400px |
假如我們有一個icon是100dp100dp,那麼為了適配所有的手機密度,理論上我們需要提供這六種畫素密度對應的圖片。分別是75px75px … 400px*400px.
但是實際開發中我們不會這麼做,為什麼呢?每張圖片都做6套的話,會造成apk體積過大,尤其是手機的內建應用廠商對每個系統應用的大小都有嚴格的要求。
一般情況下只會放置一套圖示。
那麼這套圖表放置在哪個資原始檔夾下呢?
資源怎麼放置
研究怎麼放置之前,我們先來測試一下,我的一套圖放置在不同資原始檔夾下,在同一個手機上的展示效果,記錄其展示的圖片大小和記憶體消耗。
圖片大小:984*522
手機情況:xxhdpi, 3dpi
也就是說該手機的圖片需要放置在drawable-xxhdpi資原始檔下面圖片才是原圖展示,而不會發生縮放。
記憶體情況通過如下命令可以檢視
adb shell dumpsys meminfo com.achievo.bitmademo
圖片展示大小記憶體情況統計
改圖統計的規則,資源圖片只放在一個資原始檔夾下面,其他資原始檔夾不放置該資源圖片。如下是展示圖片後統計的Bitmap圖片大小和記憶體消耗統計。
public void test(View view) {
ycy = BitmapFactory.decodeResource(getResources(), R.drawable.ycy);
imageView.setImageBitmap(ycy);
int count = ycy.getAllocationByteCount();
Log.d("zhangyu1127", "[" + ycy.getWidth() + " " + ycy.getHeight() + "] " + (count / 1024f / 1024f) + "M");
}
測試type | 圖片大小 | 圖片記憶體消耗 | Java Heap | Native Heap | Code | Stack | Graphics | Private Other | System | TOTAL |
---|---|---|---|---|---|---|---|---|---|---|
未設定圖片 | - | - | 8348 | 13680 | 4500 | 80 | 8867 | 1560 | 6724 | 43759 |
drawable-mdpi | 2952*1566 | 17.635M | 8516 | 36868 | 4296 | 92 | 33943 | 1688 | 6709 | 92112 |
drawable-hdpi | 1968*1044 | 7.838M | 8584 | 24404 | 4304 | 92 | 22463 | 1704 | 6683 | 68189 |
drawable-xhdpi | 1476*783 | 4.409M | 8896 | 21000 | 3560 | 92 | 18555 | 1532 | 6713 | 60353 |
drawable-xxhdpi | 984*522 | 1.96M | 8344 | 18188 | 4692 | 92 | 16199 | 1508 | 6845 | 55868 |
drawable-xxxhdpi | 738*392 | 1.104M | 8356 | 16940 | 4444 | 92 | 15151 | 1596 | 6698 | 53277 |
第一點疑惑:當我們放置的圖片資源在越低的畫素密度資料夾中,圖片載入出來的寬高越高,記憶體消耗越大呢?
這個疑惑,我們就通過hdpi來解答一下,我們放置一個984 * 522的圖片在drawable-hdpi資原始檔夾下,在手機畫素密度為xxhdpi, 3dpi的手機上展示。那麼你想一下,如果我們在該手機上的每個資原始檔都放置圖片,按照螢幕密度。現在你在hdpi = 1.5dpi的手機中放置了984 * 522的圖片,那麼等比例你是不是也需要在xxhdpi = 3dpi的資原始檔夾下放一張1968 * 1044 的圖片呢!
所以就是表格中統計的1968 * 1044圖片大小。
通過這個你也就發現,一般情況下我們把圖片資源放置在螢幕密度越小的資原始檔夾下面,當使用者的手機實際螢幕密度越大的時候,需要載入的圖片會放大越多。因為按照比例,圖片會越大。
所以一般只有一套圖的時候,資源主要放置在drawable-xxhdpi = 3 dpi的資原始檔夾下面。主要有兩點考慮。第一點,該螢幕密度的手機目前佔據市場主流,符合大部分的要求。另一點是,就算需要縮放,那麼也只是針對dpi>3的會放大x/3倍。其他的都是縮小展示,也不會有記憶體消耗過多的情況發生。
第二點疑惑:Java Heap內怎麼消耗變化,而主要是Native Heap和Graphics變化最多呢?
通過表格可看出,對於不同解析度,Java層記憶體消耗一致,沒什麼變化,而是消耗了native記憶體+Graphics。說明圖片載入主要消耗的是Native層的記憶體,而不是Java層的記憶體。
結論
通過該篇文章測試我們瞭解了不同的螢幕密度下的圖片資源載入到不同手機上的展示情況和記憶體消耗規律。還有就是圖片載入一般消耗的是Native層的記憶體。不同解析度的靜態資源圖片放在不同的資料夾下面,不要隨便放,會引起記憶體的異常。
文章還有很多不成熟,歡迎大佬們提提意見,有不對的歡迎評論指出!!!
相關文章
- AlamofireImage 使用 – swift載入網路圖片,縮放圖片,生成圓形圖片Swift
- Android 載入大圖片,不壓縮圖片Android
- 圖片跨域規律探尋跨域
- Android 圖片載入框架Android框架
- android 載入大量圖片Android
- Android圖片載入庫Picasso原始碼分析Android原始碼
- oracle 載入圖片檔案Oracle
- Android 圖片縮放Android
- Android 高效安全載入圖片Android
- android以不規則圖片為邊框,切割另外的圖片Android
- Android基礎第九天易忘部分(載入大圖片和縮放圖片)Android
- Flutter 圖片載入Flutter
- 圖片懶載入
- 預載入圖片
- 圖片載入事件事件
- 載入圖片方式
- 圖片載入框架Picasso - 原始碼分析框架原始碼
- 圖片載入框架Picasso原始碼分析框架原始碼
- 影片直播原始碼,載入gif圖片原始碼
- android glide圖片載入框架AndroidIDE框架
- Android 載入網路圖片 以及實現圓角圖片效果Android
- VC從檔案中載入圖片
- iOS載入WebP格式圖片小結iOSWeb
- Android:ImageView圖片縮放、居中AndroidView
- 要優雅!Android中這樣載入大圖片和長圖片Android
- Android 超高仿微信圖片選擇器 圖片該這麼載入Android
- Android 基礎之圖片載入(二)Android
- Android偽圖片載入進度效果Android
- 圖片懶載入(IntersectionObserver)Server
- 圖片懶載入原理
- 委託載入圖片
- 載入遠端圖片
- ECMAScript對資料夾圖片幻燈片播放
- 載入本地圖片模糊,Glide載入網路圖片卻很清晰地圖IDE
- android imageview 縮放檢視圖片AndroidView
- Android Volley 原始碼解析(三),圖片載入的實現Android原始碼
- Android 圖片載入框架 Picasso 基本使用和原始碼完全解析Android框架原始碼
- Android 載入大圖片時報OOM的解決方案(原始碼)AndroidOOM原始碼