Android圖片解析度dpi的相關問題解決
dpi是什麼呢?
dpi是“dot per inch”的縮寫,每英寸畫素數。
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
一般情況下的普通螢幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
dpi計算公式
DPI=對角線的畫素值/尺寸
手機螢幕解析度和螢幕密度是兩碼事!並不是800*480的解析度手機圖片就應該放在hdpi資料夾中。5.0英寸 800*480屬於mdpi
也可以通過程式碼獲取:
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 螢幕寬度(畫素) int height = metric.heightPixels; // 螢幕高度(畫素) float density = metric.density; // 螢幕密度(0.75 / 1.0 / 1.5) int densityDpi = metric.densityDpi; // 螢幕密度DPI(120 / 160 / 240)
android會根據螢幕本身的尺寸與密度特性,自動載入對應的資源,並把它們從邏輯畫素(DIP,用於定義介面佈局)轉換成螢幕上的物理畫素。
首先看看 系統是如何通過Resources的getDrawable(int id)方法找圖片的
public Drawable getDrawable(int id) throws NotFoundException { TypedValue value; synchronized (mAccessLock) { value = mTmpValue; if (value == null) { value = new TypedValue(); } else { mTmpValue = null; } getValue(id, value, true); } Drawable res = loadDrawable(value, id); synchronized (mAccessLock) { if (mTmpValue == null) { mTmpValue = value; } } return res; }
TypedValue 我們可以理解為儲存資料的型別,主要被Resouces使用於持有的資源值
通過getValue(id,value,true)方法去得到該id的資源的屬性
public void getValue(int id, TypedValue outValue, boolean resolveRefs) throws NotFoundException { boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs); if (found) { return; } throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)); }
最後通過loadDrawable(value, id)得到drawable,該方法到了底層的C程式碼,大致意思就是通過TypedValue中的方法和屬性就可以獲得我們想要的屬性值,然後載入圖片
OK,下面來做個實驗.
試驗一: 手機是1280*720 4.3英寸 屬於xdpi 圖片解析度為960*640 (按正常圖片不縮放 圖片放在手機裡面 應該不會充滿 整個手機) 我把圖片放在不
資料夾 載入時間(ms) 圖片顯示 說明
drawable 311 充滿螢幕 圖片有拉伸
drawable-nodpi 130 未充滿螢幕 圖片顯示正常
drawable-ldpi 442 充滿螢幕 圖片有拉伸
drawable-mdpi 383 充滿螢幕 圖片有拉伸
drawable-hdpi 226 充滿螢幕 圖片有拉伸
drawable-xhdpi 109 未充滿螢幕 圖片顯示正常
試驗二: 手機是800*480 4.3英寸 屬於hdpi 圖片解析度為960*640 (按正常圖片不縮放 圖片放在手機裡面 應該充滿 整個手機) 我把圖片放在不同drawable資料夾中
資料夾 載入時間(ms) 圖片顯示 說明
drawable 290 充滿螢幕 圖片拉伸
drawable-nodpi 127 充滿螢幕 圖片顯示正常
drawable-ldpi 369 充滿螢幕 圖片拉伸
drawable-mdpi 346 充滿螢幕 圖片拉伸
drawable-hdpi 124 充滿螢幕 圖片顯示正常
drawable-xhdpi 241 未充滿螢幕 圖片縮放
得到結論:
drawable-nodpi 中 圖片不會被拉伸
系統在得到圖片時候,會先到裝置對應的dpi的資料夾下去去找資原始檔,找到後應該不會做縮放直接返回圖片。
如果沒有在對應的dpi資料夾中找到,回去其他資料夾中查詢,找到後會做相應的縮放。
在高dpi找到的圖片會縮放,在低dpi的會拉伸
還有就是 原始碼中可以看出 loadDrawable的過程實在C層做的。通過系統資源id載入會比java層直接載入圖片更便捷。
相關文章
- 解決Hexo關於圖片的問題Hexo
- 解決相鄰圖片之間的空隙問題
- Android之批量載入圖片OOM問題解決方案AndroidOOM
- svn相關問題解決辦法
- nginx 解決圖片跨域問題Nginx跨域
- 開發圖書館模組遇到問題及相關解決
- 解決圖片訪問403 Forbidden問題ORB
- 解決Android通過BitmapFactory獲取圖片寬高度相反的問題Android
- 解決mysql_query()報錯的相關問題MySql
- redis快取相關問題及解決方案Redis快取
- 解決瀏覽器解析度問題瀏覽器
- Android有效解決載入大圖片時記憶體溢位的問題Android記憶體溢位
- 解決android有的手機拍照後上傳圖片被旋轉的問題Android
- Android 解析度問題Android
- Android定時關機問題解決Android
- 寶塔後臺解決寶塔相關問題
- 多行文字末尾新增圖片排版問題解決
- 成功解決github無法顯示圖片問題Github
- 【體系結構】與Checkpoint相關的問題解決思路
- 解決ROS國內rosdep init和update的相關問題ROS
- IOS下圖片不能顯示問題的解決辦法iOS
- vue 關於圖片路徑的問題Vue
- Android 軟鍵盤相關問題Android
- 使用並查集解決的相關問題並查集
- Android 圖片高斯模糊解決方案Android
- 【前端】壓縮圖片以及圖片相關概念前端
- [文件教程]解決SAE下本地除錯相關問題除錯
- 編譯OpenVPN及解決相關依賴問題編譯
- [記錄]Standby相關引數及gap問題解決
- oracle變異表觸發器相關問題解決Oracle觸發器
- WPF 讀取圖片 賦值Image控制元件 解決圖片佔用問題賦值控制元件
- 有關laravel 上傳圖片訪問404的問題Laravel
- oracle net相關問題的彙總和解決Oracle
- Android Studio 3.0 svg圖片問題AndroidSVG
- 圖片解析度修改
- wordress小程式圖片訪問出現404問題解決辦法
- android ui的幾個概念:px,dip(dp),sp,dpi,解析度等AndroidUI
- 雲伺服器composer相關錯誤問題解決伺服器