1、触摸校准基础概念
做嵌入式界面移植,触摸屏这块儿是最容易翻车的。我见过不少项目,界面跑起来了,UI 也漂亮,结果一点屏幕,光标跑到天边去了。嗯,这就是我们今天要聊的——触摸偏移。
什么是触摸偏移
说白了,就是你手指戳的位置,和系统认为你戳的位置,对不上。比如你点的是“确认”按钮,系统却以为你点了“取消”。
为什么会这样?
触摸屏和显示屏是两个物理设备。显示屏有它的分辨率,比如 1024×600。触摸屏也有它的坐标范围,比如 0~4095。两者之间天然存在一个映射关系。如果这个映射关系没配好,偏移就出现了。
触摸偏移的本质:物理触摸坐标与显示像素坐标之间的映射偏差。
我在项目中遇到过最夸张的一次,触摸坐标直接反了——点左上角,光标跑到右下角。后来查出来是驱动里坐标轴方向配置错了。这种问题,移植后几乎必现。
为什么移植后需要二次校准
你可能会问:出厂不是校准过了吗?
嗯,理论上是的。但移植意味着什么?换了 LCD 屏、换了触摸芯片、换了主板、甚至换了整机结构。这些硬件一变,原来的校准参数就废了。
我列几个常见场景:
- LCD 更换:不同厂商的屏,像素密度、安装位置都有差异
- 触摸芯片更换:从电阻屏换到电容屏,坐标输出范围完全不同
- 结构装配偏差:触摸屏和显示屏之间有了几毫米的错位
- 系统升级:从裸机换到 Linux,或者换了触摸驱动版本
这些情况,原来的校准数据基本不能用。我曾经在一个工控项目上,只是把 LCD 从 4.3 寸换成了 5.0 寸,结果触摸偏移了将近 2 厘米。不二次校准,用户根本没法操作。
注意:不要以为驱动层配好了坐标范围就万事大吉。硬件公差、安装误差、屏幕老化,都会导致偏移。二次校准不是可选项,是必选项。
校准的数学原理
校准到底在做什么?说白了,就是找一个数学公式,把触摸屏的原始坐标,换算成显示屏的像素坐标。
线性变换
最简单的模型。假设触摸屏和显示屏之间是纯线性关系:
X_display = a * X_touch + b
Y_display = c * Y_touch + d
这里 a、b、c、d 就是我们要找的校准参数。怎么找?取两个点就够了。比如左上角和右下角,记录触摸坐标和显示坐标,解方程。
但线性变换有个前提:触摸屏的 X 轴和 Y 轴必须完全正交,而且缩放比例一致。现实中有这么完美吗?很少。
仿射变换
实际项目中,我更推荐用仿射变换。它比线性变换多考虑了旋转和倾斜:
X_display = A * X_touch + B * Y_touch + C
Y_display = D * X_touch + E * Y_touch + F
六个参数,需要三个点来求解。为什么三个点?因为仿射变换能处理:
- X 轴和 Y 轴不垂直(倾斜)
- 两个轴的缩放比例不同
- 整体旋转
- 平移偏移
我习惯用三点校准法。取左上、右下、中间三个点,记录触摸坐标和显示坐标,然后解六元一次方程组。代码实现也不复杂,用个矩阵求逆就行。
我的经验:三点校准比两点校准稳定得多。两点校准只适合理想情况,一旦触摸屏有轻微旋转或安装倾斜,误差就会放大。三点校准能覆盖 95% 以上的实际场景。
下面这张图,把校准的核心逻辑串起来了:
两种变换的对比
我把线性变换和仿射变换的差异整理了一下,方便你选型时参考:
| 对比项 | 线性变换(两点法) | 仿射变换(三点法) |
|---|---|---|
| 所需点数 | 2 个 | 3 个 |
| 参数数量 | 4 个(a, b, c, d) | 6 个(A, B, C, D, E, F) |
| 支持旋转 | 否 | 是 |
| 支持倾斜 | 否 | 是 |
| 支持非等比缩放 | 否 | 是 |
| 计算复杂度 | 低 | 中 |
| 工程推荐度 | 低(仅限理想环境) | 高(覆盖绝大多数场景) |
一句话总结:移植后的触摸偏移是硬件差异导致的必然结果。二次校准的本质,是通过仿射变换建立触摸坐标到显示坐标的映射。三点校准法,是我在项目中用得最多、也最推荐的做法。