0
点赞
收藏
分享

微信扫一扫

取得手机屏幕大小DisplayMetrics的应用


文章目录

  • ​​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);

取得手机屏幕大小DisplayMetrics的应用_屏幕密度

  • 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的使用后面会提

屏幕密度的简单的计算
取得手机屏幕大小DisplayMetrics的应用_屏幕密度_02

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来计算


举报

相关推荐

0 条评论