Created
April 12, 2023 01:49
-
-
Save Pooh3Mobi/f63ac9c808712504b3cb8c75881da958 to your computer and use it in GitHub Desktop.
observing Device rotation Jetpack Compose.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
data class RotationState(val pitch: Float, val roll: Float) | |
@Composable | |
fun observeDeviceRotation(): RotationState { | |
val rotationState = remember { mutableStateOf(RotationState(0f, 0f)) } | |
val sensorManager = LocalContext.current.getSystemService(Context.SENSOR_SERVICE) as SensorManager | |
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) | |
val magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) | |
val rotationMatrix = FloatArray(9) | |
val orientationAngles = FloatArray(3) | |
val accelerometerReading = FloatArray(3) | |
val magnetometerReading = FloatArray(3) | |
val accelerometerListener = object : SensorEventListener { | |
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} | |
override fun onSensorChanged(event: SensorEvent?) { | |
event?.let { | |
System.arraycopy(it.values, 0, accelerometerReading, 0, accelerometerReading.size) | |
SensorManager.getRotationMatrix( | |
rotationMatrix, | |
null, | |
accelerometerReading, | |
magnetometerReading | |
) | |
SensorManager.getOrientation(rotationMatrix, orientationAngles) | |
rotationState.value = RotationState( | |
pitch = Math.toDegrees(orientationAngles[1].toDouble()).toFloat(), | |
roll = Math.toDegrees(orientationAngles[2].toDouble()).toFloat(), | |
) | |
} | |
} | |
} | |
val magnetometerListener = object : SensorEventListener { | |
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} | |
override fun onSensorChanged(event: SensorEvent?) { | |
event?.let { | |
System.arraycopy(it.values, 0, magnetometerReading, 0, magnetometerReading.size) | |
SensorManager.getRotationMatrix( | |
rotationMatrix, | |
null, | |
accelerometerReading, | |
magnetometerReading | |
) | |
SensorManager.getOrientation(rotationMatrix, orientationAngles) | |
rotationState.value = RotationState( | |
pitch = Math.toDegrees(orientationAngles[1].toDouble()).toFloat(), | |
roll = Math.toDegrees(orientationAngles[2].toDouble()).toFloat(), | |
) | |
} | |
} | |
} | |
LaunchedEffect(Unit) { | |
sensorManager.registerListener( | |
accelerometerListener, | |
accelerometer, | |
SensorManager.SENSOR_DELAY_NORMAL, | |
SensorManager.SENSOR_DELAY_UI | |
) | |
sensorManager.registerListener( | |
magnetometerListener, | |
magnetometer, | |
SensorManager.SENSOR_DELAY_NORMAL, | |
SensorManager.SENSOR_DELAY_UI | |
) | |
} | |
DisposableEffect(Unit) { | |
onDispose { | |
sensorManager.unregisterListener(accelerometerListener) | |
sensorManager.unregisterListener(magnetometerListener) | |
} | |
} | |
return rotationState.value | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment