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% 以上的实际场景。

下面这张图,把校准的核心逻辑串起来了:

触摸校准核心逻辑 触摸校准核心逻辑 触摸原始坐标 (X_touch, Y_touch) 校准变换 线性 / 仿射变换 求解校准参数 显示像素坐标 (X_display, Y_display) 线性变换(两点法) X_d = a·X_t + b Y_d = c·Y_t + d 适用:理想正交、无旋转 仿射变换(三点法) X_d = A·X_t + B·Y_t + C Y_d = D·X_t + E·Y_t + F 适用:有旋转、倾斜、缩放差异 核心思路 通过已知点对,求解变换参数,建立触摸坐标到显示坐标的映射 三点仿射变换是工程中最常用的方案

两种变换的对比

我把线性变换和仿射变换的差异整理了一下,方便你选型时参考:

对比项 线性变换(两点法) 仿射变换(三点法)
所需点数 2 个 3 个
参数数量 4 个(a, b, c, d) 6 个(A, B, C, D, E, F)
支持旋转 否 是
支持倾斜 否 是
支持非等比缩放 否 是
计算复杂度 低 中
工程推荐度 低(仅限理想环境) 高(覆盖绝大多数场景)

一句话总结:移植后的触摸偏移是硬件差异导致的必然结果。二次校准的本质,是通过仿射变换建立触摸坐标到显示坐标的映射。三点校准法,是我在项目中用得最多、也最推荐的做法。