Skip to content

Instantly share code, notes, and snippets.

@alphatr
Last active August 29, 2015 14:24
Show Gist options
  • Save alphatr/a4acedaa1e2269c4d56e to your computer and use it in GitHub Desktop.
Save alphatr/a4acedaa1e2269c4d56e to your computer and use it in GitHub Desktop.
<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>
/**
* 模拟摇一摇组件
* @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