JS實(shí)現(xiàn)微信搖一搖原理解析
本文為大家分享了JS實(shí)現(xiàn)微信搖一搖的原理,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)原理:
1.微信搖一搖事件需要有硬件支撐,必須要求手機(jī)中有陀螺儀
2.在JS中給window添加ondevectionmotion事件。該事件在手機(jī)晃動(dòng),即手機(jī)中的陀螺儀發(fā)生旋轉(zhuǎn),該事件會(huì)觸發(fā)
3.觸發(fā)ondevectionmotion事件,會(huì)產(chǎn)生一個(gè)事件對(duì)象,通過(guò)該對(duì)象中的鍵值(accelerationIncludingGravity)來(lái)獲得該重力加速器對(duì)象
4.重力加速器對(duì)象中含有陀螺儀的坐標(biāo),通過(guò)重力加速器對(duì)象.x - .y - .z 獲取陀螺儀當(dāng)前的坐標(biāo)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>微信搖一搖</title>
</head>
<body>
<!--請(qǐng)搖一搖-->
</body>
<script type="text/javascript">
function randomNum(m,n){
return Math.floor(Math.random(n - m + 1) + m);
}
//cover設(shè)置背景尺寸
//將背景圖按所在標(biāo)簽的寬高,縮放
document.body.style.backgroundSize = "cover";
//設(shè)置body的背景圖
document.body.style.backgroundImage = "url(img/bg.jpg)" ;
//事件設(shè)備:觸發(fā)該事件需要硬件支持
//搖一搖功能:
//1.手機(jī)中的陀螺儀加速兩次 加速器的差值當(dāng)達(dá)到某個(gè)值時(shí),則認(rèn)為是手機(jī)晃動(dòng)事件
//2.設(shè)置手機(jī)晃動(dòng)事件前,獲取加速器的值
//3.添加手機(jī)晃動(dòng)事件;
//獲取手機(jī)晃動(dòng)前加速器的值,創(chuàng)建一個(gè)對(duì)象獲取
var currentValue = {
x : 0,
y : 0,
z : 0
};
//獲取手機(jī)晃動(dòng)之后加速器的值,創(chuàng)建一個(gè)對(duì)象獲取
var lastValue = {
x : 0,
y : 0,
z : 0
}
//設(shè)置晃動(dòng)的最小的距離,只有達(dá)到該距離時(shí),才執(zhí)行搖一搖事件
var minValue = 20;
//當(dāng)手機(jī)觸發(fā)搖一搖事件時(shí),我們得到此時(shí)的位置信息,存儲(chǔ)到一個(gè)p標(biāo)簽上
//理論上講:陀螺儀事件中的加速器是無(wú)法靜止的;
var p1 = document.createElement("p");
//第一種方式:
var img1 = document.createElement("img");
img1.style.width = "375px";
img1.style.height = "560px";
//手機(jī)晃動(dòng)事件
window.ondevicemotion = function(e){
//獲取對(duì)象
var event1 = event || e;
//獲取加速器對(duì)象,為了獲取陀螺儀上的坐標(biāo)信息
var acceleration = event1.accelerationIncludingGravity;
//記錄當(dāng)前加速器的值
currentValue.x = acceleration.x;
currentValue.y = acceleration.y;
currentValue.z = acceleration.z;
//判斷微信搖一搖事件(手機(jī)是否晃動(dòng))
if (Math.abs(currentValue.x - lastValue.x) >= minValue || Math.abs(currentValue.y - lastValue.y) > minValue || Math.abs(currentValue.z - lastValue.z) > minValue) {
//說(shuō)明搖一搖事件觸發(fā)
//實(shí)現(xiàn)微信搖一搖,可以將搖一搖中的圖片,作為body的背景圖
//隨機(jī)一張圖片的下標(biāo)(1 - 5)
var ranN = randomNum(1,6);
//創(chuàng)一個(gè)定時(shí)器
var timer = setInterval(function(){
ranN ++
if (ranN == 6) {
ranN = 1;
}
//為當(dāng)前的body設(shè)置背景圖
//document.body.style.backgroundImage = "url(img/"+ranN+".jpg)";
//為當(dāng)前img設(shè)置路徑
img1.src = "img/"+ranN+".jpg";
},200);
//設(shè)置一個(gè)延時(shí)器,延時(shí)一段時(shí)間后消除延時(shí)器
setTimeout(function(){
clearInterval(timer);
},1000);
}
//記錄最后的值(保存上一次晃動(dòng)事件中的加速器的值)
lastValue.x = currentValue.x;
lastValue.y = currentValue.y;
lastValue.z = currentValue.z;
}
document.body.appendChild(img1);
</script>
</html>
注意:該代碼中沒(méi)有上傳圖片,如需要運(yùn)行需要自己在代碼的同級(jí)目錄創(chuàng)建一個(gè)img文件夾,里面放上從1到6的后綴為.jpg的圖片
相關(guān)文章
JavaScript設(shè)計(jì)模式之原型模式分析【ES5與ES6】
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之原型模式,簡(jiǎn)單描述了原型模式的概念、原理,并結(jié)合實(shí)例形式分析了ES5與ES6實(shí)現(xiàn)原型模式的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
JavaScript變量or循環(huán)中的var和let詳解
這篇文章主要介紹了JavaScript變量or循環(huán)中的var和let詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
利用bootstrapValidator驗(yàn)證UEditor
這篇文章主要為大家詳細(xì)介紹了利用bootstrapValidator驗(yàn)證UEditor,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
layui 阻止圖片上傳的實(shí)例(before方法)
今天小編就為大家分享一篇layui 阻止圖片上傳的實(shí)例(before方法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
BootStrap實(shí)現(xiàn)手機(jī)端輪播圖左右滑動(dòng)事件
用bootstrap做出的項(xiàng)目輪播圖在手機(jī)端不能滑動(dòng),為此找了好多插件、框架。但是都不能和bootstrap良好的結(jié)合。經(jīng)過(guò)一番折騰終于找到了解決方法,下面小編通過(guò)本文給大家簡(jiǎn)單介紹下2016-10-10

