Android Kotlin导航中基于传感器实现地图平滑旋转的问题
Android Kotlin 地图双向平滑旋转实现
问题场景
开发Android Kotlin导航功能时,需要基于传感器回调实现地图随用户朝向平滑旋转,原有实现仅支持单向旋转,无法适配实际使用需求。
原有实现逻辑
1. 传感器角度获取
通过Sensor的onSensorChanged回调获取用户朝向,转换为范围-180~180的数学角度:
degres = Math.toDegrees(mOrientation.get(0).toDouble())
2. 抖动过滤逻辑
设置±10度差值阈值过滤传感器微小抖动,避免地图异常晃动:
if (gps != null) { if(degres!! !in lastDegres!!-10..lastDegres!!+10 && degres!!>0 || degres!! !in lastDegres!!-10 ..lastDegres!!+10 && degres!!<0 ){ //here lastDegres = degres } }
3. 单向旋转缺陷代码
原有平滑旋转逻辑仅支持向右旋转:
if (gps != null) { if(degres!! !in lastDegres!!-10..lastDegres!!+10 && degres!!>0 || degres!! !in lastDegres!!-10 ..lastDegres!!+10 && degres!!<0 ){ var result = (lastDegres!! - (degres!! )).toInt() for (i in 0..result) { setOrientation(((180 + lastDegres!! + i ).toFloat())) update() } lastDegres = degres } }
双向平滑旋转实现
实现双向旋转的核心是先判断距离当前角度最近的旋转方向(向左/向右),参考实现代码如下:
if (gps != null) { realpos = degres!! * -1 if (realpos < 0) realpos += 360 dif = if (realpos > lastDegres!!) { realpos - lastDegres!! } else { (lastDegres!! - realpos) } if (dif > 10) { if(realpos > lastDegres!!){ for (i in 1..dif.toInt()*50000) { orientation = (lastDegres!!.toFloat()+i/50000) update() } }else if (lastDegres!! > realpos) { for (i in 1..dif.toInt()*50000){ orientation = (lastDegres!!.toFloat()-i/50000) update() } } lastDegres = realpos }
内容的提问来源于stack exchange,提问作者godislikemyquestionsrets
相关产品推荐
相关产品推荐

