Android開發圖片分辨率問題解決方案

dpi是什麼呢?
dpi是「dot per inch」的縮寫,每英寸像素數。
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
通常狀況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。java

dpi計算公式
DPI=對角線的像素值/尺寸android

手機屏幕分辨率和屏幕密度是兩碼事!並非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)方法找圖片的get

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中的方法和屬性就能夠得到咱們想要的屬性值,而後加載圖片it

OK,下面來作個實驗.io

試驗一: 手機是1280*720 4.3英寸 屬於xdpi 圖片分辨率爲960*640 (按正常圖片不縮放 圖片放在手機裏面 應該不會充滿 整個手機) 我把圖片放在不float

文件夾 加載時間(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層直接加載圖片更便捷。

相關文章
相關標籤/搜索