Maison  >  Article  >  interface Web  >  Utilisez l'événement devicemotion de HTML5 pour réaliser la loterie en secouant le téléphone portable et la loterie lors de la réunion annuelle

Utilisez l'événement devicemotion de HTML5 pour réaliser la loterie en secouant le téléphone portable et la loterie lors de la réunion annuelle

高洛峰
高洛峰original
2017-02-09 15:43:401730parcourir

Secouer la logique du script JS :
La prochaine étape est l'implémentation de la logique du script JS mobile. L'implémentation du shake nécessite l'aide du nouvel événement devicemotion en HTML5 pour obtenir la vitesse de changement de l'appareil en position. et la direction. Pour information, l'utilisation de base de cet événement est la suivante :

if (window.DeviceMotionEvent) {
    window.addEventListener('devicemotion', handler, !1);
    lastTime = new Date();
} else {
    alert('你的浏览器不支持摇一摇功能.');
}

Il existe un attribut accélérationIncludingGravity dans l'objet événement devicemotion, qui comprend : un objet contenant les attributs x, y et z, prenant en compte en tenant compte de l'accélération naturelle de la gravité dans le cas de l'axe z, vous indique l'accélération dans chaque direction. Pour l’utilisation spécifique de cette API, vous pouvez vous référer aux informations sur Internet. Il en existe de nombreuses, je ne les répéterai donc pas ici. La logique spécifique du tremblement est la suivante :

function handler(e) {
    var current = e.accelerationIncludingGravity;
    var currentTime;
    var timeDifference;
    var deltaX = 0;
    var deltaY = 0;
    var deltaZ = 0;

    //记录上一次设备在x,y,z方向上的加速度 
    if ((lastX === null) && (lastY === null) && (lastZ === null)) {
        lastX = current.x;
        lastY = current.y;
        lastZ = current.z;
        return;
    }

    //得到两次移动各个方向上的加速度绝对差距
    deltaX = Math.abs(lastX - current.x);
    deltaY = Math.abs(lastY - current.y);
    deltaZ = Math.abs(lastZ - current.z);
    //当差距大于设定的阀值并且时间间隔大于指定阀值时,触发摇一摇逻辑
    if (((deltaX > threshold) && (deltaY > threshold)) || ((deltaX > threshold) && (deltaZ > threshold)) || ((deltaY > threshold) && (deltaZ > threshold))) {
        currentTime = new Date;
        timeDifference = currentTime.getTime() - lastTime.getTime();
        //时间间隔
        if (timeDifference > timeout) {
            //触发摇一摇事件
            dealShake();
            lastTime = new Date;
        }
    }

    lastX = current.x;
    lastY = current.y;
    lastZ = current.z;
}

Ne tenez pas compte de la probabilité de gagner de chaque prix

L'exemple de code final complet :

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
    <title>摇一摇抽奖</title>
   <style type="text/css">
       html,body{ width:100%; height:100%; background-color: #000; margin:0; overflow: hidden;}
       .tip{ position: absolute; bottom: 30px; left: 10px; color: #fff; font-family: &#39;楷体&#39;; text-align: center; right: 10px; height: 32px; line-height: 32px; background-color: rgba(255,255,255,.4); border-radius: 3px; } .tip.active{ -webkit-animation: jump 1.5s linear; animation: jump 1s linear; } 
   </style>
</head>
<body>
    <div class="tip" id="tip"> </div>
    
    <script type="text/javascript">
        var lastX = null,
            lastY = null,
            lastZ = null;
        var threshold = 3; //灵敏度(值越小灵敏度越高)
        var timeout = 1000;
        var lastTime = null;
        var isShaking = !1;
        document.addEventListener(&#39;DOMContentLoaded&#39;, function (e) {
            ready();
        }, !1);

        /*脚本逻辑:
        *移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的devicemotion事件,获取设备在位置和方向上的改变速度的相关信息。
        *devicemotion事件对象中有一个accelerationIncludingGravity属性,该属性包括:一个包含x、y 和z 属性的对象,在考虑z 轴自然重力加速度的情况下,告诉你在每个方向上的加速度。
        */
        function ready() {
            if (window.DeviceMotionEvent) {
                window.addEventListener(&#39;devicemotion&#39;, handler, !1);
                lastTime = new Date();
            } else {
                alert(&#39;你的浏览器不支持摇一摇功能.&#39;);
            }
        }

        function handler(e) {
            var current = e.accelerationIncludingGravity;
            var currentTime;
            var timeDifference;
            var deltaX = 0;
            var deltaY = 0;
            var deltaZ = 0;

            //记录上一次设备在x,y,z方向上的加速度 
            if ((lastX === null) && (lastY === null) && (lastZ === null)) {
                lastX = current.x;
                lastY = current.y;
                lastZ = current.z;
                return;
            }

            //得到两次移动各个方向上的加速度绝对差距
            deltaX = Math.abs(lastX - current.x);
            deltaY = Math.abs(lastY - current.y);
            deltaZ = Math.abs(lastZ - current.z);
            //当差距大于设定的阀值并且时间间隔大于指定阀值时,触发摇一摇逻辑
            if (((deltaX > threshold) && (deltaY > threshold)) || ((deltaX > threshold) && (deltaZ > threshold)) || ((deltaY > threshold) && (deltaZ > threshold))) {
                currentTime = new Date;
                timeDifference = currentTime.getTime() - lastTime.getTime();
                //时间间隔
                if (timeDifference > timeout) {
                    //触发摇一摇事件
                    dealShake();
                    lastTime = new Date;
                }
            }

            lastX = current.x;
            lastY = current.y;
            lastZ = current.z;
        }

        function dealShake() {
            if (isShaking) return;
            isShaking = !0;

            document.getElementById("tip").innerHTML = "恭喜您,摇中:" + GetName();

            setTimeout(function () {
                isShaking = !1;
                document.getElementById("tip").innerHTML = " ";
            }, 1000);

        }

        function GetName() {
            var chars = ["一等奖", "二等奖", "三等奖", "四等奖", "五等奖"];
            return chars[GetRandom(0, chars.length - 1)];
        }
        function GetRandom(minValue, maxValue) {
            return Math.round(Math.random() * (maxValue - minValue)) + minValue;
        }
    </script>

</body>

shake.html

Faire plus Utilisation de HTML5 L'événement Devicemotion réalise la loterie en secouant le téléphone portable. Pour les articles liés à la loterie de l'assemblée annuelle, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn