UNPKG

2.48 kBJavaScriptView Raw
1import { throttle } from '../../utils';
2import { CallbackManager, MethodHandler } from '../../utils/handler';
3const callbackManager = new CallbackManager();
4let devicemotionListener;
5/**
6 * 停止监听加速度数据。
7 */
8export const stopAccelerometer = ({ success, fail, complete } = {}) => {
9 const res = {};
10 const handle = new MethodHandler({ name: 'stopAccelerometer', success, fail, complete });
11 try {
12 window.removeEventListener('devicemotion', devicemotionListener, true);
13 return handle.success(res);
14 }
15 catch (e) {
16 res.errMsg = e.message;
17 return handle.fail(res);
18 }
19};
20const INTERVAL_MAP = {
21 game: {
22 interval: 20,
23 frequency: 50
24 },
25 ui: {
26 interval: 60,
27 frequency: 16.67
28 },
29 normal: {
30 interval: 200,
31 frequency: 5
32 }
33};
34/**
35 * 开始监听加速度数据。
36 */
37export const startAccelerometer = ({ interval = 'normal', success, fail, complete } = {}) => {
38 const handle = new MethodHandler({ name: 'startAccelerometer', success, fail, complete });
39 try {
40 if (window.DeviceMotionEvent) {
41 const intervalObj = INTERVAL_MAP[interval];
42 if (devicemotionListener) {
43 stopAccelerometer();
44 }
45 devicemotionListener = throttle((evt) => {
46 var _a, _b, _c;
47 callbackManager.trigger({
48 x: ((_a = evt.acceleration) === null || _a === void 0 ? void 0 : _a.x) || 0,
49 y: ((_b = evt.acceleration) === null || _b === void 0 ? void 0 : _b.y) || 0,
50 z: ((_c = evt.acceleration) === null || _c === void 0 ? void 0 : _c.z) || 0
51 });
52 }, intervalObj.interval);
53 window.addEventListener('devicemotion', devicemotionListener, true);
54 }
55 else {
56 throw new Error('accelerometer is not supported');
57 }
58 return handle.success();
59 }
60 catch (e) {
61 return handle.fail({ errMsg: e.message });
62 }
63};
64/**
65 * 监听加速度数据事件。频率根据 Taro.startAccelerometer() 的 interval 参数。可使用 Taro.stopAccelerometer() 停止监听。
66 */
67export const onAccelerometerChange = callback => {
68 callbackManager.add(callback);
69};
70/**
71 * 取消监听加速度数据事件,参数为空,则取消所有的事件监听
72 */
73export const offAccelerometerChange = callback => {
74 callbackManager.remove(callback);
75};