小程序之坑 - 蓝牙onBeaconUpdate/罗盘onCompassChange/设备方向onDeviceMotionChange/加速器onAccelerometerChange

项目: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()
  }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Misha韩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值