Last active
August 29, 2015 14:24
-
-
Save alphatr/a4acedaa1e2269c4d56e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<meta name="viewport" content="width=device-width, user-scalable=0, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/> | |
<div></div> | |
<script src="shake.js"></script> | |
<script> | |
Shake.init(); | |
Shake.on('shakeend', function () { | |
var a = document.createElement('p'); | |
a.innerHTML = 'shake end'; | |
document.getElementsByTagName('div')[0].appendChild(a); | |
}); | |
Shake.on('shakestart', function () { | |
var a = document.createElement('p'); | |
a.innerHTML = 'shake start'; | |
document.getElementsByTagName('div')[0].appendChild(a); | |
}); | |
Shake.start(); | |
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 模拟摇一摇组件 | |
* @author alphatr | |
*/ | |
;(function (name, exports) { | |
// 检测有模块加载器 | |
var hasDefine = typeof define === 'function'; | |
// 检测是否有普通模块加载-node | |
var hasExports = typeof module !== 'undefined' && module.exports; | |
// 封装模块 | |
if (hasDefine) { | |
define(exports); | |
} else if (hasExports) { | |
module.exports = exports(); | |
} else { | |
this[name] = exports(); | |
} | |
})('Shake', function () { | |
var options = { | |
shakeThreshold: 1000, // 加速度阈值 | |
interval: 100, // 检测时间间隔 | |
stopTimes: 5 // 停止摇动检测的次数 | |
}; | |
var inited = false, started = false; | |
var init = function (opts) { | |
opts = opts || {}; | |
// 传递参数 | |
for (i in opts) { | |
options[i] = opts[i]; | |
} | |
if (!window.DeviceMotionEvent) { | |
return; | |
} | |
window.addEventListener('devicemotion', handler, false); | |
inited = true; | |
}; | |
var start = function () { | |
if (!inited) { | |
return; | |
} | |
started = true; | |
}; | |
var stop = function () { | |
if (!inited) { | |
return; | |
} | |
started = false; | |
}; | |
var lastUpdate = 0; | |
var lastAcc = {x: 0, y: 0, z: 0}; | |
var elseTimes = 0; | |
var shakeStart = false; | |
var handler = function (e) { | |
if (!inited || !started) { | |
return; | |
} | |
var curTime = new Date().getTime(); | |
if ((curTime - lastUpdate) < options.interval) { | |
return; | |
} | |
var diffTime = curTime -lastUpdate; | |
lastUpdate = curTime; | |
var acc = e.accelerationIncludingGravity; | |
var diff = acc.x + acc.y + acc.z - lastAcc.x - lastAcc.y - lastAcc.z; | |
var speed = parseInt(Math.abs(diff) / diffTime * 10000, 10); | |
if (speed > options.shakeThreshold) { | |
elseTimes = 0; | |
if (!shakeStart) { | |
shakeStart = true; | |
event.emit('shakestart'); | |
} | |
} else { | |
elseTimes++; | |
if (shakeStart && elseTimes > options.stopTimes) { | |
shakeStart = false; | |
event.emit('shakeend'); | |
} | |
} | |
lastAcc = { | |
x: acc.x, | |
y: acc.y, | |
z: acc.z | |
}; | |
}; | |
// 简单自定义事件 | |
var event = { | |
pool: {}, | |
emit: function (type) { | |
if (!event.pool[type]) { | |
return; | |
} | |
var length = event.pool[type].length; | |
if (!length) { | |
return; | |
} | |
for (var i = 0; i < length; i++) { | |
event.pool[type][i].apply(this, [].slice.call(arguments, 1)); | |
} | |
}, | |
on: function (type, fn) { | |
if ( !event.pool[type] ) { | |
event.pool[type] = []; | |
} | |
event.pool[type].push(fn); | |
} | |
}; | |
return { | |
on: event.on, | |
start: start, | |
init: init, | |
stop: stop | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment