【发布时间】:2022-11-16 17:04:01
【问题描述】:
我正在尝试使用加速度计+磁力计值在我的地图上绘制方位线。所以我正在使用谷歌示例。这是我得到的:
private val sensorManager by lazy { context.getSystemService(Context.SENSOR_SERVICE) as SensorManager }
private val lastAccelerometerReading = FloatArray(3)
private val latMagnetometerReading = FloatArray(3)
private val rotationMatrix = FloatArray(9)
private val orientationAngles = FloatArray(3)
private var lastAccelerometerSet = false
private var lastMagnetometerSet = false
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
System.arraycopy(event.values, 0, lastAccelerometerReading, 0, lastAccelerometerReading.size)
lastAccelerometerSet = true
} else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
System.arraycopy(event.values, 0, latMagnetometerReading, 0, latMagnetometerReading.size)
lastMagnetometerSet = true
}
if (lastAccelerometerSet && lastMagnetometerSet) updateOrientationAngles()
Timber.d("!!! orientation = ${
orientationAngles[0] * (180 / Math.PI)
}")
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit
fun registerDeviceOrientationListener() {
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer ->
sensorManager.registerListener(
this,
accelerometer,
SensorManager.SENSOR_DELAY_NORMAL,
SensorManager.SENSOR_DELAY_UI
)
}
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField ->
sensorManager.registerListener(
this,
magneticField,
SensorManager.SENSOR_DELAY_NORMAL,
SensorManager.SENSOR_DELAY_UI
)
}
}
fun unregisterDeviceOrientationListener() {
sensorManager.unregisterListener(this)
}
private fun updateOrientationAngles() {
SensorManager.getRotationMatrix(
rotationMatrix,
null,
lastAccelerometerReading,
latMagnetometerReading
)
SensorManager.getOrientation(rotationMatrix, orientationAngles)
}
它工作正常,但我有一个问题。当我将方向从弧度转换为度数格式时,我得到了 (-180; 180) 格式的值。但我需要它是 (0; 360) 格式才能让我的地图正常工作。
那么我怎样才能把它变成 (0; 360) 格式呢?现在北方为 0,东北-南方向为 180,西北-南方向为 0 到 -180。我需要它在北方为 0,在西北-南方方向为 180,在东南-北方方向为 180 到 360,就像 Google 的 Fused 位置中的 bearing
【问题讨论】:
标签: android kotlin accelerometer magnetometer