Android屏幕相關知識
屏幕參數
屏幕大小
對角線的長度,比如我們常見的4.7寸/5.5寸。分辨率
手機屏幕像素點的個數,比如720*1080,就是寬有720個像素點,高有1080個像素點。PPI/DPI
每英寸像素,我們計算的話就是對角線上的像素點數除以屏幕大小得到的。
手機屏幕密度
在android系統中,系統定義個幾個標準的DPI值,用來作爲固定的DPI。我們在開發中美工會做不同屏幕密度的圖給開發人員,具體對照關係如下:
密度 | ldpi | mdpi | hdpi | xhdpi | xxhdpi |
---|---|---|---|---|---|
密度值 | 120 | 160 | 240 | 320 | 480 |
分辨率 | 240*320 | 320*480 | 480*800 | 720*1280 | 1080*1920 |
獨立像素密度 dp
由於每個廠商的android手機的具有的不同的大小尺寸和不同像素密度的屏幕,屏幕尺寸碎片化嚴重。導致同樣像素大小的長度,在不同的屏幕上顯示長度不同。相同長度的屏幕,高密度的屏幕包含更多的像素點。
android系統是喲個mdpi密度值爲160的屏幕作爲標準,在這個屏幕上1dp=1px。其他屏幕通過比例進行換算,如下:
mdpi | 1dp=1px |
---|---|
hdpi | 1dp=1.5px |
xhdpi | 1dp=2px |
xxhdpi | 1dp=3px |
由上表可以看出各個分辨率換算比例ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12。
單位換算
而我們在實際開發中考慮到屏幕適配,我們在佈局文件中儘量使用與屏幕的物理參數無關的單位如dp和sp,而不用px;在程序中,也可以很方便的對這些單位進行轉換,可將下面代碼作爲工具類保存在項目中。
public class DensityUtil {
/**
* 將dip或dp值轉換爲px
*
* @param context
* @param dpValue
* @return
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 將px值轉換爲dip或dp
*
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 將px值轉換爲sp
*
* @param context
* @param pxValue
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 將sp值轉換爲px
*
* @param context
* @param pxValue
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
* 獲得屏幕物理像素width
*
* @param context
* @return
*/
public static int getScreenWidth(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
/**
* 獲得屏幕物理像素height
*
* @param context
* @return
*/
public static int getScreenHeight(Activity context) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
}