项目:taro3 + vue3
蓝牙的坑
有的安卓手机蓝牙打开了,但是并不能监听到蓝牙
解决:蓝牙开启且授权,但是不能监听到蓝牙,需要在微信 设置->个人信息与权限->系统权限管理->前往系统设置->权限管理->打开定位
罗盘 onCompassChange 安卓上的坑
坑1:不稳定,静止不动波动也很大
坑2:手机竖向垂直地面,绕x轴旋转,角度有变化,差不多180度的差距
坑3:文档上是5次/s, 真机是10次/s
坑3:不可以有多个监听
设备方向 startDeviceMotionListening频率的坑
Taro.startDeviceMotionListening({
interval: 'game',
success: (e) => {}
})
文档上频率:game->20ms/次; ui->60ms/次; normal->200ms/次
真机:
加速器startAccelerometer的频率
Taro.startAccelerometer({
interval: 'game',
success: (e) => {}
})
文档上频率:game->20ms/次; ui->60ms/次; normal->200ms/次
真机:
如果这几个api同时用到,并且频率不统一,会被带偏
频率的解决方案:
interval都设置为game, 并且在监听里面用上50ms的节流
Taro.onDeviceMotionChange((res2) => {
throttle(() => {
// do sth.
}, 50)
})
Taro.onCompassChange((res2) => {
throttle(() => {
// do sth.
}, 50)
})
Taro.onAccelerometerChange((res2) => {
throttle(() => {
// do sth.
}, 50)
})
网上找了一个支持同时多个节流的函数:
export function throttle(fun, wait = 1500) {
let funcValue1 = fun.toString()
let hash = funcValue1
let startTime = Date.now()
if (functionReqMap.get(hash)) {
let funcValue = functionReqMap.get(hash)
// 防止因为特殊原因没有移除map中该函数的记录,导致一直无法执行函数的问题
if (funcValue && funcValue.startTime + funcValue.wait <= startTime) {
functionReqMap.delete(hash)
} else {
return
}
}
functionReqMap.set(hash, {
startTime: startTime,
wait: wait,
})
// 执行函数调用
fun()
// 拦截在wait期间的函数再次调用,在超时后,将限制解除
setTimeout(() => {
let needRemoveKeys = []
functionReqMap.forEach(((value, key, map) => {
let curTime = Date.now()
let funcValue = map.get(key)
if (funcValue && funcValue.startTime + funcValue.wait <= curTime) {
// @ts-ignore
needRemoveKeys.push(key)
}
}))
needRemoveKeys.map((value) => {
functionReqMap.delete(value)
})
}, wait)
}
监听只能存在一个解决方案
分别用开关控制,只要start了,就打开开关
/**
* 监听设备
* @returns {Promise<void>}
*/
export async function useUpdateDevice() {
if (!isStartDeviceMotionListening) {
_startDeviceMotion()
}
if (!isStartAccelerometer) {
_startAccelerometer()
}
if (!isStartCompass) {
_startCompass()
}
}