, . SensorManager.getOrientation, 5 OpenGL. , - .
. , , , , , . , , (event.values[0]) 0. , . , .
enum Android , , Android, , .
enum class CompassCoordinateSystem { POCKET_COMPASS, REAR_CAMERA }
Then write SensorEventListenerto track changes. For clarity, I did not import android.hardware.SensorManager.*in the code below. All arrays defined below are filled with static SensorManager methods.
private var orientation3D = FloatArray(3)
private var coordinateSystem = CompassCoordinateSystem.REAR_CAMERA_ROTATION
fun compassDegrees(): Float = azimuthToDegrees(compassRadians())
fun compassRadians(): Float = orientation3D[0]
fun azimuthToDegrees(azimuth: Float): Float {
return ((Math.toDegrees(azimuth.toDouble())+360) % 360).toFloat()
}
override fun onSensorChanged(event: SensorEvent?) {
if (event?.sensor?.type == Sensor.TYPE_ROTATION_VECTOR) {
val rotationMatrix = FloatArray(9)
SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values)
when (coordinateSystem) {
CompassCoordinateSystem.POCKET_COMPASS -> SensorManager.getOrientation(rotationMatrix, orientation3D)
CompassCoordinateSystem.REAR_CAMERA -> {
val rearCameraMatrix = FloatArray(9)
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_X,
SensorManager.AXIS_Z,
rearCameraMatrix)
SensorManager.getOrientation(rearCameraMatrix, orientation3D)
}
}
}
}
source
share