网上的小型称重计不只一个,但这里介绍的是TouchScale的实现方法,它的开发者是Asher Trockman,其开发过程值得借鉴。

一、TouchScale的用法

使用的方法很简单,只需在浏览器中打开Weigh things on your iPhone!,然后选择3D Touch Sensitivity(Light/Medium/Firm),再放上需要称重的物体,即可得出重量。特别提醒,特别提醒,特别提醒:只能称非常轻的物件,而且测出来的数据上限是330~350克左右,千万千万别称重物以及会划伤屏幕的物品!!
需要注意的是,3D Touch需要物体接触屏幕时才能触发电容,再而才有这个功能。所以,在物体的选择上,需要能够直接接触得到屏幕并触发电容的物体。
如果不需要自己手机的3D Touch Sensitivity的参数值,可以在手机的Settings > General > Accessibility > 3D Touch中查看。

二、TouchScale的实现

整个软件的核心是重力与重量的转换关系。经过数据分析,得出的公式是
其中
force:物体+手机的重力;tareForce:手机的重力;maxForce:手机内置的最大重力,固定值为6.66666;forceIndex:重力参数值,对应3D Touch Sensitivity的设置如下表:
Sensitivity	Granularity Light	0.0208333 Medium	0.0166666 Firm	0.0138888
数据来源:3D Touch: Sensitivity, Force vs. Weight
这个公式是怎么得到的呢?根据作者的描述,他将传统称重计和苹果手机的重力感应器放在一起测量,用手指不断按压,得到了重力与重量的关系。
图片来源:3D Touch: Sensitivity, Force vs. Weight
经过多次测量,得到数据,然后画图(如下),可以从图中看出重力与重量呈线性关系。
图表来源:3D Touch: Sensitivity, Force vs. Weight
maxForce
作者指出3D Touch压力感应的范围是[0,6.66666],所以对应的重量大约可以换算成[0g, 337g],大约是1:50左右。则其最大重力值为6.66666。
forceIndex
由于3D Touch感应灵敏度的设置不同,其感应程度也不同,经过测试,就有了上面提到的重力参数值表。
Sensitivity	Granularity Light	0.0208333 Medium	0.0166666 Firm	0.0138888
数据来源:3D Touch: Sensitivity, Force vs. Weight
force / tareForce
重力值是通过Safari内置和重力有关的API直接获取的。
至此,TouchSense的工作已明了。

三、TouchSense的改进

当苹果推出iPhone 8以及更新iOS 10之后,对3D Touch的API作出一些调整,而作者继续对上面的公式作了一些调整。
与标准称重计对比,作者对公式做出了微调。原来的公式如下:
作者微调公式如下:
其中,forceIndex的对应关系变成了
Sensitivity	Index Light	0.8 Medium	1 Firm	1.2
作者是把maxForce和上一版本的forceIndex合并计算,换算成参数405.257,将公式换算为乘法计算。
另外,当物体重量小于12克时,根据测量出来的数据显示,它比软件称出来的结果轻,所以,当小于12克时,作者将截距部分去掉了。
至此,原理解释完毕。

参考附录