---恢復內容開始---
今天做屏幕適配的時候,發現一個奇怪的現象:
HTC D820u/ 紅米Note/HONOR H30-L02 /Coolpad 8297-T01 4款手機的分辨率均為 1280 * 720,但是得到的densityDpi
都是320,這跌破了我一直以來的觀點(densityDpi = 屏幕對角線的像素值/對角線的尺寸)。像素值是一樣的,但尺寸明顯是不一樣的,
densityDpi 怎么可能一樣?
 
那么dpi = 320/2 = 240/1.5 = 160 像素/英寸,也可以稱之為像素密度,而手機像素密度(density)實際上是以單位英寸160個像素作為參考標准的。
再來看看 densityDpi
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
dm.densityDpi 就可以獲得密度Dpi通過查詢源碼可知:android.util.DisplayMetrics 類中
public void setToDefaults() {
widthPixels = 0;
heightPixels = 0;
density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
densityDpi = DENSITY_DEVICE;
scaledDensity = density;
xdpi = DENSITY_DEVICE;
ydpi = DENSITY_DEVICE;
noncompatWidthPixels = widthPixels;
noncompatHeightPixels = heightPixels;
noncompatDensity = density;
noncompatDensityDpi = densityDpi;
noncompatScaledDensity = scaledDensity;
noncompatXdpi = xdpi;
noncompatYdpi = ydpi;
}
densitDpi 是由DENSITY_DEVICE  賦值的,而 DENSITY_DEVICE 是個常量 
        public static int DENSITY_DEVICE = getDeviceDensity();private static int getDeviceDensity() {
// qemu.sf.lcd_density can be used to override ro.sf.lcd_density
// when running in the emulator, allowing for dynamic configurations.
// The reason for this is that ro.sf.lcd_density is write-once and is
// set by the init process when it parses build.prop before anything else.
return SystemProperties.getInt("qemu.sf.lcd_density",
SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
}qemu.sf.lcd_density 在模擬器中運行時可以用來覆蓋ro.sf.lcd_density,允許動態的配置這么做的理由是:ro.sf.lcd_density 只能被寫入一次,由初始化進程在做其他的事之前解析build.prop時設置。那就是說densiDpi 默認是從 ro.sf.lcd_density 這個文件讀取的。而這個文件在system/build.prop 內。adb shellcd systemcat system/build.prop 可以查看里面的東西,放置的都是一些系統的配置。或者adb shell getprop ro.sf.lcd_density 直接查看果然 默認的就是320。查閱相關資料 :http://www.jb51.net/article/33238.htm提起分辨率,我們需要了解兩個概念,圖像分辨率和輸出分辨率。
圖像分辨率是每英寸的像素數,以ppi為單位,圖像分辨率又常常被表示成每一個方向上的總像素數量,比如640×480像素、1280×960像素等。而決定圖像輸出質量的是圖像的輸出分辨率,描述的是設備輸出圖像時每英寸可產生的點數(dpi),以dpi為單位,兩者有聯系但並不總是相等的。
dpi (dot per inch)輸出分辨率
打印機分辨率又稱為輸出分辨率,是指在打印輸出時橫向和縱向兩個方向上每英寸最多能夠打印的點數,通常以“點/英寸”即dpi(dot per inch)表示。而所謂最高分辨率就是指打印機所能打印的最大分辨率,也就是所說的打印輸出的極限分辨率。平時所說的打印機分辨率一般指打印機的最大分辨率,目前一般激光打印機的分辨率均在600×600dpi以上。
dpi是“dot per inch”的縮寫。顧名思義,就是指在每英寸長度內的點數。通常,我們都使用dpi來作為掃描器和打印機的解析度單位,數值越高表示解析度越高。目前,市面上出售掃描器的光學解析度主要有600×1200 dpi和1200×2400 dpi兩種。掃描器的光學解析度由兩個數字構成,是因為橫向解析度和縱向解析度不同。較小的數字通常為縱向解析度,即我們一般區分掃描器解析度用的數值。也就是說,600×1200 dpi的掃描器,我們通常簡稱為600 dpi。
電腦顯示器的解析度約為72dpi,這個數值其實是這樣計算出來的:以一部15寸的電腦顯示器為例,可視面積的水平長度大約為11.2寸,如果顯示模式是800×600,那么解析度就是800/11.2=71.4。如果是17寸電腦顯示器,以1024×768的顯示模式來看,解析度就變成1024/12.8=80了。
而dpi只是輸出分辨率,PPI(Pixels Per Inch)才是圖像分辨率,兩個根本就不是一個東西。
而android 用dip(dp) 做長度單位時 : pix = dip * (densityDpi / 160) = dip * density , densityDpi = 160 時 density = 1 , pix == dip 。
---恢復內容結束---

