同学让我帮她写一个用于婚礼上使用的摇一摇手机网页,使用的是
function init(){
if (window.DeviceMotionEvent) {
// 移动浏览器支持运动传感事件
window.addEventListener('devicemotion', deviceMotionHandler, false);
}
}
其中
deviceMotionHandler是监听方法,如下:
var SHAKE_THRESHOLD = 3000;
var UPDATE_INTERVAL_TIME = 70;
// 定义一个变量保存上次更新的时间
var last_update = 0;
// 紧接着定义x、y、z记录三个轴的数据以及上一次出发的时间
var x = 0;
var y = 0;
var z = 0;
var last_x = 0;
var last_y = 0;
var last_z = 0;
var count = 1;
var arrorder = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var running = false;
function deviceMotionHandler(eventData) {
if(running)
return ;
// 获取含重力的加速度
var acceleration = eventData.accelerationIncludingGravity;
// 获取当前时间
var curTime = new Date().getTime();
var timeInterval = curTime -last_update;
// 固定时间段
//alert(timeInterval);
if(timeInterval < UPDATE_INTERVAL_TIME){
//alert(timeInterval);
return ;
}
last_update = curTime;
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
var deltaX = x - last_x;
var deltaY = y - last_y;
var deltaZ = z - last_z;
last_x = x;
last_y = y;
last_z = z;
var temp = deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ;
var tt = Math.sqrt(temp);
var speed = (tt/timeInterval)*10000;
//alert("speed="+speed);
//var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 30000;
//alert(speed);
if (speed > SHAKE_THRESHOLD) {
running = true;
// TODO:在此处可以实现摇一摇之后所要进行的数据逻辑操作
$('#hand').css({"display": "block"});
$('#orderbg').css({
"background":"url(img/yaoyiyaobg.jpg) no-repeat",
"position": "absolute",
"top" : "0px",
"background-size":"100% 100%"
});
$('#hand').attr("class", "hand hand-animate");
switch(count){
case 1:
setTimeout(function(){
$('#hand').css({"display": "none"});
$('#orderbg').css({
"background":"url(img/order1.jpg) no-repeat",
"position": "absolute",
"top" : "0px",
"background-size": "100% 100%"
});
//$('#order1').css({"display":"block"});
running = false;
},1000);
count = count + 1;
break;
default:
running = true;
$('#hand').attr("class", "hand");
alert('摇号结束!刷新可重新摇。');
break;
}
}
last_x = x;
last_y = y;
last_z = z;
}
我发现,监听器在监听的过程中是启动多个线程的,就是一摇一下,但是这个方法却执行了两到三次,甚至四次,由于在js中没有听说过线程同步,因此,我使用了一个全局的running变量,当一个线程在执行的时候,其他线程都会自动退出,这是一个解决方案。
网上搜了很多,都是一个解决方案,比如这位大神@david1030 的一篇文章:
http://blog.csdn.net/david1030/article/details/8229008
我也写android代码,在安卓里面,为了解决摇一摇监听器在短时间内多次调用的问题,在一次执行的时候,将监听器短暂的注销掉,然后再添加上去
具体可以看下面的博客@xn4545945