Kotlin运行时获取手机屏幕厘米尺寸及像素位置单位转换问题
像素/DP转屏幕物理厘米坐标实现方案
结论先行
你已经具备dp和像素互转能力的前提下,完全可以在运行时将坐标转换为厘米单位。
核心转换逻辑
厘米属于物理长度单位,转换的核心是获取屏幕的真实物理像素密度,而非适配用的归一化密度值,具体步骤如下:
- 第一步:获取屏幕真实X/Y轴PPI(每英寸像素数)
注意不要使用系统适配用的基准DPI(比如安卓的densityDpi、iOS的point缩放系数对应的归一化DPI),要获取设备硬件上报的真实像素密度:- 安卓端直接读取
DisplayMetrics类的xdpi、ydpi属性即可,分别对应X、Y轴每英寸的真实像素数 - iOS端可以通过
UIScreen的官方属性读取真实PPI数值
- 安卓端直接读取
- 第二步:代入转换公式计算
固定换算常量:1英寸 = 2.54厘米
先计算每厘米对应像素数:
X轴每厘米像素数 =xdpi / 2.54
Y轴每厘米像素数 =ydpi / 2.54
坐标转换:
厘米坐标X值 = 像素X坐标 / X轴每厘米像素数
厘米坐标Y值 = 像素Y坐标 / Y轴每厘米像素数
如果你当前持有的是dp坐标,先把dp转为真实像素坐标,再代入上述公式即可。
常见问题说明
- 绝大多数主流消费级设备上报的真实PPI数值校准准确,转换误差在1%以内,可以满足普通应用的使用需求
- 极少数老旧设备可能存在厂商上报PPI不准的问题,如果你的应用对精度要求极高(比如工业级测量场景),可以增加用户手动校准环节:引导用户将已知物理长度的标准物品(如身份证,宽度固定为8.56厘米)放置在屏幕上,采集对应像素长度反算真实密度,抵消系统上报误差。
内容的提问来源于stack exchange,提问作者nitzan karby
相关产品推荐
相关产品推荐

