我正在开发一个需要用指南针旋转mapView的应用程序.我知道如何旋转相机,但我需要用指南针旋转mapView.中心点应该是当前位置.我找到了地图V1的代码,但我需要使用Maps V2
android google-maps google-maps-api-2 google-maps-android-api-2 android-maps-v2
似乎有许多旧的例子表明在Android设备上获得当前的主要方向,但Google提供的官方解决方案似乎并未出现在他们的文档中.
最古老的参考Sensor.TYPE_ORIENTATION它被废弃了,更近的提及Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGNETIC_FIELD(我曾尝试,但收效甚微-准确迅速的变化取决于设备的方向).我一直在尝试使用这两个这样的实现.我甚至见过一些人TYPE.GRAVITY.
在最近似乎表明 TYPE_ROTATION_VECTOR这显然是一个稠合的传感器(参考),但实例实施方案中似乎并不容易得到.
我需要使用这些位置/运动传感器,而不是GPS,因为在需要进行此测量时,用户不会移动.无论手机是平的还是垂直的(如果你正在拍照),也需要测量稳定
在我们以某种方式拉出度数测量之后,转换到基数方向似乎很容易.(/sf/answers/1774484211/)
以前的方案
java android android-sensors compass-geolocation sensor-fusion
我已经根据我可以在网上找到的通常建议实施了指南针读数。我使用ROTATION_VECTOR传感器类型,并(azimuth, pitch, roll)使用标准 API 调用将其转换为三元组。这是我的代码:
fun Fragment.receiveAzimuthUpdates(
azimuthChanged: (Float) -> Unit,
accuracyChanged: (Int) -> Unit
) {
val sensorManager = activity!!.getSystemService(Context.SENSOR_SERVICE)
as SensorManager
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)!!
sensorManager.registerListener(OrientationListener(azimuthChanged, accuracyChanged),
sensor, 10_000)
}
private class OrientationListener(
private val azimuthChanged: (Float) -> Unit,
private val accuracyChanged: (Int) -> Unit
) : SensorEventListener {
private val rotationMatrix = FloatArray(9)
private val orientation = FloatArray(3)
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type != Sensor.TYPE_ROTATION_VECTOR) return
SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)
SensorManager.getOrientation(rotationMatrix, orientation)
azimuthChanged(orientation[0]) …Run Code Online (Sandbox Code Playgroud)