在iOS Safari中使用JavaScript检测摇晃?

10

我如何利用新的MobileSafari设备运动API来捕获“摇晃”事件?

1个回答

19

请查看这篇很棒的博客文章:http://www.jeffreyharrell.com/blog/2010/11/creating-a-shake-event-in-mobile-safari/

该博客文章提供了以下示例:

if (typeof window.DeviceMotionEvent != 'undefined') {
    // Shake sensitivity (a lower number is more)
    var sensitivity = 20;

    // Position variables
    var x1 = 0, y1 = 0, z1 = 0, x2 = 0, y2 = 0, z2 = 0;

    // Listen to motion events and update the position
    window.addEventListener('devicemotion', function (e) {
        x1 = e.accelerationIncludingGravity.x;
        y1 = e.accelerationIncludingGravity.y;
        z1 = e.accelerationIncludingGravity.z;
    }, false);

    // Periodically check the position and fire
    // if the change is greater than the sensitivity
    setInterval(function () {
        var change = Math.abs(x1-x2+y1-y2+z1-z2);

        if (change > sensitivity) {
            alert('Shake!');
        }

        // Update new position
        x2 = x1;
        y2 = y1;
        z2 = z1;
    }, 150);
}

2
太好了。感谢您添加代码片段。应该会有所帮助! - tbeseda
3
警告:加速度计包括重力的读数不可能三个分量都为零。如果重力直接作用于某一个轴上,那么该轴的值将为9.81。另外,在事件期间检查摇晃,为什么不在一个时间间隔内进行检查呢? - ughoavgfhw
@Jacob Relkin,我发现在我的iPhone 4S上,单次摇晃后警报会发生两次。为什么? - andilabs
@andi 我唯一的更改是摆脱了间隔,而是将代码放在事件处理程序中。现在想想,如果使用多个事件,这可能不太有效,因为更改可能会出现得更慢。至于双重警报:当您开始摇晃和停止时,都会发生变化,因此您将收到每个变化的警报。 - ughoavgfhw
1
这篇链接的博客文章已经被删除了。它是否可以在其他地方查看,或者有类似的文章我可以阅读吗? - Jody Heavener
需要iOS 13+中的权限,请参见https://dev.to/li/how-to-requestpermission-for-devicemotion-and-deviceorientation-events-in-ios-13-46g2 - diachedelic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接