一、屏幕分辨率
屏幕分辨率是指屏幕显示的像素数量,通常以水平像素数乘以垂直像素数表示,例如 1920x1080。它直接影响屏幕的显示效果,包括图像的清晰度和细节。不同的设备可能有不同的屏幕分辨率。
1、常见的屏幕分辨率
- 标准分辨率:
480x320(HVGA):早期手机屏幕分辨率
800x480(WVGA):一些旧的平板和手机
1024x600(WVGA):一些旧的平板 - 高清分辨率
1280x720(HD):一些中低端手机和平板
1920x1080(Full HD):大多数现代手机和平板
2560x1440(Quad HD):一些高端手机
3840x2160(4K UHD):一些高端设备 - 宽屏分辨率
1366x768(WXGA):一些笔记本和平板
1920x1080(Full HD):大多数现代设备
2560x1440(Quad HD):一些高端设备 - 其他分辨率
1440x900(WXGA+):一些笔记本
1600x900(HD+):一些笔记本
2048x1536(Retina Display):一些iPad
2560x1600(QXGA):一些高端笔记本
2、获取屏幕分辨率
在 Android 开发中,通过 DisplayMetrics 类可获取设备屏幕分辨率:
// 屏幕分辨率(以像素为单位)
val displayMetrics = Resources.getSystem().displayMetrics
val screenWidth = displayMetrics.widthPixels
val screenHeight = displayMetrics.heightPixels
Log.d(TAG, "screen width: $screenWidth, height: $screenHeight")
二、屏幕密度
屏幕密度(Screen Density)是指屏幕单位面积上的像素数量,通常用每英寸像素数(PPI,Pixels Per Inch)来表示。屏幕密度越高,屏幕上显示的像素就越密集,图像也就越清晰。
1、屏幕密度类别(以dpi为单位):
密度类别 | PPI范围 | 缩放比例 |
---|---|---|
ldpi(低密度) | 120dpi | 0.75x |
mdpi(中密度) | 160dpi | 1.0x |
hdpi(高密度) | 240dpi | 1.5x |
xhdpi(超高密度) | 320dpi | 2.0x |
xxhdpi(超超高密度) | 480dpi | 3.0x |
xxxhdpi(超超超高密度) | 640dpi | 4.0x |
缩放比例是指相对于mdpi(中等密度)的缩放倍数。例如:
- ldpi的缩放比例是0.75,表示其像素密度是mdpi的75%。
- hdpi的缩放比例是1.5,表示其像素密度是mdpi的150%。
- xhdpi的缩放比例是2.0,表示其像素密度是mdpi的200%。
2、获取屏幕密度
在Android开发中,可以通过DisplayMetrics类获取设备的屏幕密度。
val displayMetrics = Resources.getSystem().displayMetrics
// 屏幕密度(以dp为单位)
// 屏幕密度是指屏幕上每英寸(in)的像素数(Pixels Per Inch,PPI)。
// 它反映了屏幕的物理像素密度。屏幕密度越高,屏幕显示的像素就越密集,图像和文字就越清晰。
val density = displayMetrics.density
// 屏幕密度(以dpi为单位)
// ldpi(低密度):120dpi
// mdpi(中密度):160dpi
// hdpi(高密度):240dpi
// xhdpi(超高密度):320dpi
// xxhdpi(超超高密度):480dpi
// xxxhdpi(超超超高密度):640dpi
val densityDpi = displayMetrics.densityDpi
Log.d(TAG, "density: $density, densityDpi: $densityDpi")
3、使用屏幕密度(资源限定符)
为了确保应用在不同屏幕密度的设备上都能良好显示,需要为不同密度的屏幕提供不同分辨率的图片资源。Android支持通过资源限定符来实现这一点。例如:
- drawable-ldpi / mipmap-ldpi:低密度屏幕的图片资源
- drawable-mdpi / mipmap-mdpi:中等密度屏幕的图片资源
- drawable-hdpi / mipmap-hdpi:高密度屏幕的图片资源
- drawable-xhdpi / mipmap-xhdpi:超高密度屏幕的图片资源
- drawable-xxhdpi / mipmap-xxhdpi:超超高密度屏幕的图片资源
- drawable-xxxhdpi / mipmap-xxxhdpi:超超超高密度屏幕的图片资源
使用密度无关像素(dp)
在布局文件中,建议使用dp(density-independent pixels)作为单位,而不是像素(px)。dp是一个虚拟像素单位,它会根据屏幕密度自动调整,从而确保UI元素在不同密度的屏幕上保持一致的显示效果。
三、屏幕最小宽度(smallestWidth)
屏幕最小宽度(smallestWidth)是指设备屏幕的最短边的宽度,单位为dp(密度无关像素)。它不会随着屏幕方向的变化而改变,因此非常适合用于布局适配。
1、计算屏幕最小宽度
屏幕最小宽度可以通过以下公式计算:
smallestWidth = 屏幕最短边的像素数 / 屏幕密度比例
例如,如果设备的屏幕分辨率为1080x1920像素,屏幕密度为320dpi,则屏幕最小宽度为:
smallestWidth= 1080 / (320/160) = 540dp
其中,屏幕密度比例(density)为320dpi / 160dpi = 2。
2、使用屏幕最小宽度适配
为了适配不同屏幕尺寸的设备,可以使用 smallestWidth 限定符来创建不同的资源文件夹,系统会根据设备的屏幕最小宽度自动选择对应的资源文件夹。例如:
- values-sw360dp:适用于最小宽度为360dp的设备
- values-sw400dp:适用于最小宽度为400dp的设备
- values-sw600dp:适用于最小宽度为600dp的设备
3、获取设备的屏幕最小宽度
通过 DisplayMetrics 类可获取设备的屏幕最小宽度。
// 屏幕最小宽度 dp 值
val displayMetrics = Resources.getSystem().displayMetrics
val screenWidthDp = displayMetrics.widthPixels / displayMetrics.density
val screenHeightDp = displayMetrics.heightPixels / displayMetrics.density
val smallestWidthDp = min(screenWidthDp, screenHeightDp)
Log.d(TAG, "Smallest width in dp: $smallestWidthDp")
通过合理使用屏幕最小宽度(smallestWidth)和对应的资源限定符,可以有效实现Android应用的屏幕适配。