1.Android手机屏幕的分辨率和尺寸大小不一,千奇百怪,这在我们自定义view以及做屏幕适配的时候造成了一定的困难,要想高效的解决遇到的问题,需要我们毒地手机屏幕有一定的认识。
2.屏幕参数
1.屏幕大小:
指的是屏幕对角线的长度,用“寸”来表示,比如我们所说的4.7寸,5.5寸的手机。
2.分辨率:
指的是手机屏幕的像素点个数,例如720x1080就是指的屏幕的分辨率,指的是宽有720个像素点,高有1080个像素点。
3.PPI
每英寸像素(Pixels Per Inch),也叫作DPI(Dots Per Inch).它是有对角线的像素点个数除以屏幕的大小得到的。
3.系统屏幕密度
每个厂商的Android手机具有不同的大小尺寸和像素密度的屏幕。Android系统如果要精确到每种DPI的屏幕,那基本上是不可能的,所以系统定义了几个标准的DPI值,作为手机的固定DPI.如下所示:
4. 独立像素密度dp
正是各种屏幕的密度不同,导致同样大小的长度,在不同密度的屏幕上显示的长度不同,因为相同长度的屏幕,高密度的屏幕包含有更多的像素点。Android系统使用mdpi即密度值为160的屏幕作为标准。在这时候1px = 1dp。其他屏幕则要通过比例换算。例如同样是100dp的长度,在mdpi中为100px,而在hdpi中为150px。所以我们也可以得出各个密度值的换算公式。
在mdpi中1dp = 1px,
在hdpi中1dp = 1.5px,
在xhdpi中1dp = 2px,
在xxhdpi中1dp = 3px。
5.px与sp,dip之间单位的转换
/**
* 将px值转化成dip值,保证尺寸大小不变
* @param context
* @param pxValues px值
* @return
*/
public static int px2dip(Context context, float pxValues) {
// 获取当前屏幕显示的密度值
float density = context.getResources().getDisplayMetrics().density;
return (int) (pxValues / density + 0.5f); // 加0.5f四舍五入
}
/**
* 将dip值转化成px值,保证尺寸大小不变
* @param context
* @param dipValues dip值
* @return
*/
public static int dip2px(Context context, float dipValues) {
// 获取当前屏幕显示的密度值
float density = context.getResources().getDisplayMetrics().density;
return (int) (dipValues * density + 0.5f); // 加0.5f四舍五入
}
/**
* 将px值转换为sp值,保证文字大小不变
* @param context
* @param pxValues
* @return
*/
public static int px2sp(Context context, float pxValues) {
// 获取当前字体显示的密度值
float fontDensity = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValues / fontDensity + 0.5f); // 加0.5f四舍五入
}
/**
* 将sp值转换为px值,保证文字大小不变
* @param context
* @param spValues
* @return
*/
public static int sp2px(Context context, float spValues) {
// 获取当前字体显示的密度值
float fontDensity = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValues * fontDensity + 0.5f); // 加0.5f四舍五入
}