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;
}
}