文章目录
- DisplayMetrics信息获取
- densityDpi和density关系
- densityDpi和xDpi、yDpi的关系
- android单位转换(TypedValue)
DisplayMetrics信息获取
以小米6为例(小米10发布了,但是6依旧坚挺。强)
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
tv.setText("widthPixels:"+displayMetrics.widthPixels+"\n
heightPixels:"+displayMetrics.heightPixels+"\n
density:"+displayMetrics.density+"\n
densityDpi:"+ displayMetrics.densityDpi+"\n
scaledDensity:"+displayMetrics.scaledDensity+"\n
xdpi:"+displayMetrics.xdpi+"\n ydpi:"+displayMetrics.ydpi);
- widthPixels:屏幕宽度
- heightPixels:屏幕高度
- densityDpi:屏幕密度,每英寸的像素数
- density:密度比值,和densityDpi相关,其实就是densityDpi/160得出来的值(160密度就是谷歌定的一个密度标准),不同手机dp换算px就是通过该值。
- scaledDensity:同density,用于文字缩放的计算,也就是sp
- xDpi:水平方向的真实密度
- yDpi:垂直方向的真是密度
densityDpi和density关系
上面已经说了,density
就是densityDpi
除以标准密度160的出来的一个比值(参考上图),主要用于常用dp的计算,比如,小米6控件宽设为360dp的话,换算成像素就是1080px就是全屏了
densityDpi和xDpi、yDpi的关系
xDpi
和yDpi
是屏幕真实的屏幕密度,如上面小米6获取是428.625,densityDpi大概是厂家设定的一个值(确实没搞清这个值怎么得来的),咱们做界面适配基本也只会使用densityDpi,xDpi和yDpi的使用后面会提
屏幕密度的简单的计算
android单位转换(TypedValue)
传入单位与value将其计算为对应的px数值
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f / 72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f / 25.4f);
}
return 0;
}
首先理解dp:在每英寸160像素的显示屏上,1px = 1dp,在密度低的屏幕上或许1dp=1px,但在密度高的屏幕上可能1dp=4px。换算也就是px = dp(每英寸的像素数/160),即px = dp(densityDpi / 160)
,上面说了densityDpi / 160 = density
,所以px = dp*density
文字sp的换算通过metrics.scaledDensity
我们不常用的单位:pt磅,in英寸,mm毫米,都采用了xdpi来计算