屏幕尺寸,屏幕分辨率,屏幕密度,各种长宽单位(px,sp,dp,in.pt,mm)
1.屏幕单位
名称 |
单位缩写 |
单位全拼 |
介绍 |
屏幕尺寸 | '' 或 in | inch | 屏幕的大小,通常用屏幕对角线的长度表示.单位是寸 |
屏幕分辨率 | px | pixels |
整个屏幕的像素数,一般用屏幕的像素宽度(水平像素数)乘以像素高度表示,形如1280x720, 反之分辨率为1280x720的屏幕,像素宽度不一定为1280 |
屏幕密度或像素密度 |
dpi |
dots per inch |
每英寸中的像素数。计算公式:屏幕分辨率/屏幕尺寸, |
打印分辨率 |
dpi |
dots per inch |
dpi 原是印刷上的记量单位,意指每平方英寸上,所印刷的网点数。 在android中是每英寸中的像素点数,计算公式: (√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸) |
图像的采样率 |
ppi |
pixels per inch |
ppi才是是图像分辨率的单位,在图像中,每英寸所包含的像素数。 数码相机拍出来的图片因品牌或生产时间不同可能有所不同,常见的有72ppi,180ppi和300ppi |
2.长度单位
名称 | 单位缩写 | 单位全拼 | 介绍 |
像素 | px | pixels |
“像素”(Pixel) 是由 Picture(图像) 和 Element(元素)这两个单词的字母所组成的, 是用来计算数码影像的一种单位,若把影像放大数倍,会发现这些连续色调其实是由 许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。 缩写 px。 |
比例像素 | sp | scaled pixels | 带比例的像素,android中主要用它处理字体的大小,设置字体大小的最佳单位。 |
与设备无关像素 | dip/dp |
device independent pixels |
长度单位,根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是: 标准密度为160dpi,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi 的平台则表示1.5个像素的长度这个和设备硬件有关, 一般为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素。等同于dp |
英寸 | in | inches | 通常用屏幕对角线的长度 |
点数 | pt | points | 一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用 |
毫米 | mm | millimeters |
3.取得常用屏幕参数的方法
3.1 取屏幕参数
1 public MySystemParams(Activity activity) { 2 DisplayMetrics dm = new DisplayMetrics(); 3 activity.getWindowManager().getDefaultDisplay().getMetrics(dm); 4 screenWidth = dm.widthPixels; 5 screenHeight = dm.heightPixels; 6 densityDpi = dm.densityDpi; 7 scale = dm.density; 8 fontScale = dm.scaledDensity; 9 10 screenOrientation = screenHeight > screenWidth ? SCREEN_ORIENTATION_VERTICAL 11 : SCREEN_ORIENTATION_HORIZONTAL; 12 }
3.2 取dpi代码
1 val density = resources.displayMetrics.density 2 val dpi = density * 160 3 Log.e("MainActivity","density = $density, dpi = $dpi")
4. android ldpi、mdpi、hdpi、xxhdpi表
官网:
https://developer.android.com/training/multiscreen/screendensities#TaskProvideAltBmp
ldpi |
低密度 (ldpi) 屏幕 (~ 120dpi) |
mdpi |
中密度 (mdpi) 屏幕 (~ 160dpi) (这是基准密度) |
hdpi |
高密度 (hdpi) 屏幕 (~ 240dpi) |
xhdpi |
加高 (xhdpi) 密度屏幕 (~ 320dpi) |
xxhdpi |
超超高密度 (xxhdpi) 屏幕 (~ 480dpi) |
xxxhdpi |
超超超高密度 (xxxhdpi) 屏幕 (~ 640dpi) |
nodpi |
与密度无关的资源。无论当前屏幕的密度是多少,系统都不会缩放以此限定符标记的资源。 |
tvdpi |
介于 mdpi 和 hdpi 之间的屏幕(约 213dpi) |
如果有一个可绘制位图资源,它在中密度屏幕上的大小为 48x48 像素,那么它在其他各种密度的屏幕上的大小应该为:应遵循六种主要密度之间的 3:4:6:8:12:16 缩放比。
- 36x36 (0.75x) - 低密度 (ldpi)
- 48x48(1.0x 基准)- 中密度 (mdpi)
- 72x72 (1.5x) - 高密度 (hdpi)
- 96x96 (2.0x) - 超高密度 (xhdpi)
- 144x144 (3.0x) - 超超高密度 (xxhdpi)
- 192x192 (4.0x) - 超超超高密度 (xxxhdpi)
5.px,dp,sp单位转换公式
5.1 常用计算公式
dpi = 屏幕分辨率/屏幕尺寸(英寸)
px = dp * (dpi / 160)
5.2 DisplayMetrics.density
DisplayMetrics.density
是当前屏幕密度相当于标准密度的缩放系数。即:DisplayMetrics.density = 屏幕dpi / 160
在中密度屏幕上,DisplayMetrics.density
等于 1.0;
在高密度屏幕上,它等于 1.5;
在超高密度屏幕上,等于 2.0;在低密度屏幕上,等于 0.75。
此数字是一个系数,用其乘以 dp
单位,即可得出当前屏幕的实际像素数。
5.3 打印屏幕信息代码
1 fun printScreen(){ 2 3 //过期方法 4 run { 5 val display = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { 6 baseContext.display 7 } else { 8 getWindowManager().getDefaultDisplay() 9 } 10 val metrics = DisplayMetrics() 11 display?.getMetrics(metrics) 12 13 val width = metrics.widthPixels 14 val height = metrics.heightPixels 15 16 val density = metrics.density 17 val scaleDensity = metrics.scaledDensity 18 19 val dpi = metrics.densityDpi 20 val ydpi = metrics.ydpi 21 val xdpi = metrics.xdpi 22 23 Log.e("screen","width = $width,height = $height," 24 + " density = $density,scaledDensity = $scaleDensity " 25 + " dpi = $dpi,xdpi = $xdpi,ydpi = $ydpi") 26 } 27 28 //新方法 29 val metrics = resources.displayMetrics 30 31 val width = metrics.widthPixels 32 val height = metrics.heightPixels 33 34 val density = metrics.density 35 val scaleDensity = metrics.scaledDensity 36 37 val dpi = metrics.densityDpi 38 val ydpi = metrics.ydpi 39 val xdpi = metrics.xdpi 40 41 Log.e("screen","width = $width,height = $height," 42 + " density = $density,scaledDensity = $scaleDensity " 43 + " dpi = $dpi,xdpi = $xdpi,ydpi = $ydpi") 44 }
结果:
1 width = 1080,height = 2264, density = 3.0,scaledDensity = 3.0 dpi = 480,xdpi = 397.565,ydpi = 401.594 2 width = 1080,height = 2264, density = 3.0,scaledDensity = 3.0 dpi = 480,xdpi = 397.565,ydpi = 401.594