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
值锁定为 64px,而是会根据屏幕的接触点大小进行调整)。
这到底是什么意思?
您可以将其视为一种准确表示用户手指在屏幕上的大小、形状和方向的方式。用户并不总是用手指尖点按屏幕,而是经常按压屏幕,就像向警察提供指纹一样。如果没有 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 的跟踪文档。