使用 rotationAngle 和 touchRadius

Chrome 39 中对 Chrome 中的 Touch API 进行了相对较小的更改,在 TouchEvent 对象上引入了 webkitRotationAngle 属性的工作版本。现在,在 Chrome 45(2015 年 7 月推出 Beta 版)中,它不带前缀,为 rotationAngle,这使我们的实现更符合 TouchEvent 规范和 Firefox。

虽然 rotationAngle 已经存在了一段时间,但还是值得解释一下它是什么,因为它开启了一些更有趣的轻触手势用法,尤其是在移动设备上。

从技术上讲,旋转角度是由 Touch.radiusX 和 Touch.radiusY 定义的接触区域椭圆的角度(介于 0 到 90 度之间)。呃,很酷,对吧?(应该注意的是,我只是发现 Android 上的 Chrome 不会将 radiusX 和 radiusY 值锁定为 64 像素,而是根据屏幕的接触尺寸而变化)。

这到底意味着什么?

您可以将其视为一种准确表示用户手指在屏幕上的大小、形状和方向的方式。用户并不总是用指尖轻触屏幕,而是经常像给警察留指纹一样按压屏幕。如果没有 rotationAngle,您只能获取触摸手势的宽度和高度。使用 rotationAngle,您可以获得 90 度的旋转角度(0 度为垂直,90 度为水平)。为什么只有 90 度?您只需要 90 度,因为当您移动超过这些角度时,radiusX 和 radiusY 会发生变化以适应。

另一个很酷的功能是,用户手指的接触面积会随着手指在屏幕上的压力程度而变化。它不能直接替代 force,但您可以区分屏幕上的轻触,因为轻触的表面积比用力按压的表面积小。

如何使用?

首先,您需要一个可以检测到此情况的设备。Nexus 10 就可以。一个很好的例子是直接查看 Rick Byers 的绘制示例。不过,不甘示弱的是,这里有一种不使用画布的方法。

var touchHandler = function(e) {
    e.preventDefault();
    var touches = e.changedTouches;
    var touch = touches[0]; // only concerned about first touch.
    
    var rotationAngle = touch.rotationAngle || touch.webkitRotationAngle || 0;
    var radiusX = touch.radiusX || touch.webkitRadiusX || 1;
    var radiusY = touch.radiusY || touch.webkitRadiusY || 1;
    var force = touch.force || touch.webkitForce || 0;
    
    // Use the rotationAngle to rotate the 'p' element.
    
    p.style.width = radiusX * 2 + 'px';
    p.style.height = radiusY * 2 + 'px';
    p.style.transform = "rotate(" + rotationAngle + "deg)";
};

document.documentElement.ontouchstart = touchHandler;
document.documentElement.ontouchend = touchHandler;
document.documentElement.ontouchmove = touchHandler;

在实践中,您会在哪里使用此功能?

在一些显而易见的情况下,这会立即给用户带来好处:

  • 例如,绘画和图片处理 Web 应用可以使用这些信息来更改应用于画布的笔画或效果。您可以使用触摸半径来改变画笔的大小,还可以结合使用 rotationAngle 来改变画笔在画布上的接触角度。
  • 增强的手势识别:如果您了解 rotationAngle,则可以创建单指手势来使对象旋转。

是否所有设备都支持此功能?

不会。目前,这种情况还不是很常见。如果您使用的是 Nexus 10,您会看到类似以下内容:

触摸角度旋转屏幕截图

图片由 Rick Byers 提供。

如果设备无法识别触摸的旋转角度,rotationAngle 将为 0,radiusX 和 radiusY 值将相等(但可能会因当前触摸表面积而异)。

为何要如此费心?

问得好。与网络上的许多功能一样,这是一种附加体验。
触摸事件在受支持时会起作用,如果半径和旋转值可用,您可以增强应用,为用户提供更强大的体验。并非每个用户都有 Wacom 数位板,但如果有,许多绘画应用都会利用它。

指针事件呢?

这实际上只是为了确保我们为依赖触摸事件 API 的开发者提供一个完全完善的触摸事件 API。看,我有点回避这个问题…不过,更重要的是,如果您有兴趣关注 Blink 的 PointerEvent 实现,可以为问题 471824 加注星标,并阅读 Rick Byers 的跟踪文档。

另请参阅