我将在 iOS6.0 (iPhone 5)、iOS5.1.1 (iPad 3)、Android 4.2.1 (Chrome 18.0.1025469) 上的 Nexus 7 和 Nexus 7 上的 Firefox for Android 17 上发布我的发现。
目前只有 iPhone 5 的数据。这是很多工作。
我所做的是在页面和touchstart
调用中创建两个元素preventDefault()
以防止滚动。然后我计算了它和缓冲区touchmove
的长度并将其显示在 DOM 中。此外,我计算了事件发生的速率。这是代码片段:changedTouches
targetTouches
// exposed is a variable which other code uses rAF to present a representation of it on the DOM so I can view it
touchmove: function(evt) {
evt.preventDefault();
var time = Date.now();
var diff = time - exposed.touch_move_last_time;
if (!exposed.touch_move_last_time) exposed.touch_move_last_time = Date.now();
if (!exposed.touch_move_rate) exposed.touch_move_rate = 0;
exposed.touch_move_last_time = time;
exposed.touch_move_rate += (diff - exposed.touch_move_rate)*0.01;
exposed.touch_move_changedTouches_count = evt.changedTouches.length;
exposed.touch_move_targetTouches_count = evt.targetTouches.length;
当我四处移动手指时,我将它移动成一个圆圈而不是之字形,因为在之字形点它可以触发比采样率更少的事件。由于收敛速度低(这是为了产生不会持续波动的数字),持续摩擦大约需要 5 秒才能使读数稳定在采样率上。
iOS6.0:
将两根手指放在一个元素中并移动一根手指:
changedTouches
大小:1(移动的那个)
targetTouches
大小:2(两个手指在元素上)
采样率:16.66ms
将两根手指放在一个元素中并左右移动:
changedTouches
大小:2(都在移动)
targetTouches
大小:2(元素上的两个手指)
采样率:16.66ms
在每个元素中放下一根手指并移动一根手指:
changedTouches
大小:1(移动的那个)
targetTouches
大小:1(指的是移动的那个最初触摸的元素)
采样率:16.66ms
在每个元素中放下一根手指并左右移动两根手指:
changedTouches
大小:1(移动的那个)
targetTouches
大小:1(指移动的那个最初触摸的元素)
采样率:8.29ms
在第一个元素中放下一根手指,在第二个元素中放下两个手指:
如果在第二个元素中移动一根手指
changedTouches
大小:1
targetTouches
大小:2
采样率:16.66ms
如果在第二个元素中移动两个手指
changedTouches
大小:2
targetTouches
大小:2
采样率:16.6 毫秒(真的很难保持第一根手指不动)
如果在第一个元素中移动手指
changedTouches
大小:1
targetTouches
大小:1
采样率:16.66ms
如果在第一个元素中移动手指,在第二个元素中移动一个手指
changedTouches
大小:1
targetTouches
大小:在 1 和 2 之间波动
采样率:8.29ms
如果移动所有三个手指
changedTouches
大小:在 1 和 2 之间波动
targetTouches
大小:2 采样率:约 8.3 毫秒
在每个元素中放下两根手指,在每个元素中左右移动一根手指:
changedTouches
尺寸:1
targetTouches
尺寸:2
采样率:约 9ms
很明显,在采样率为 ~120Hz 的所有情况下,我至少有两个元素在其中移动,这显然表明它将touchmove
为每个同时触摸的元素触发一个单独的元素。我敢打赌,将测试扩展到 3 个元素会看到 180Hz 的采样率。更新:我在 iPad 上测试了 3 个元素,它确实产生了 5.4 毫秒的读数。
我有点好奇的是为什么我总是得到 8.29ms 而不是 8.33ms。9ms 的读数可能只是因为它的处理量比全速处理的多(因为我已经让 DOM 更新每一帧)
另一个更新:
在 Nexus 7 上的 Chrome 上,changedTouches
缓冲区似乎总是充满了所有的触摸,因为webkitForce
每次触摸的读数总是在变化。它也很慢,以至于采样率读数给出的有用信息为零。但是通过更改页面上最后一个有序元素中存在的手指数量,似乎touchmove
事件也正确地在每个元素的基础上被触发。
Nexus 7 上的 Firefox 在产生合理的采样率读数方面要好一些,但显示的更新比 Chrome 还要慢。在 Firefox 变得不那么不稳定之前,我认为让代码在其上正常工作是不值得的。