Skip to content

Instantly share code, notes, and snippets.

@Pooh3Mobi
Created April 12, 2023 01:49
Show Gist options
  • Save Pooh3Mobi/f63ac9c808712504b3cb8c75881da958 to your computer and use it in GitHub Desktop.
Save Pooh3Mobi/f63ac9c808712504b3cb8c75881da958 to your computer and use it in GitHub Desktop.
observing Device rotation Jetpack Compose.
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