Recalculate shutter speed on ISO and aperture changes

This commit is contained in:
2024-08-05 21:30:48 +02:00
parent 0e164b41bf
commit b8b30ca5b0
@@ -48,7 +48,10 @@ class MainActivity : ComponentActivity(), SensorEventListener {
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
LightMeterTheme { LightMeterTheme {
LightmeterHomeScreen(state = lightmeterState ) LightmeterHomeScreen(
state = lightmeterState,
recalculateShutterSpeed = { recalculateShutterSpeed() }
)
} }
} }
@@ -56,18 +59,25 @@ class MainActivity : ComponentActivity(), SensorEventListener {
illuminanceSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) illuminanceSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
} }
private fun updateLightmeterState(illuminance: Double) { private fun recalculateShutterSpeed() {
val illuminance = lightmeterState.value.illuminance
val iso = lightmeterState.value.iso val iso = lightmeterState.value.iso
val aperture = lightmeterState.value.aperture val aperture = lightmeterState.value.aperture
val shutterSpeed = (aperture * aperture) / (illuminance * (iso / 100)) val shutterSpeed = (aperture * aperture) / (illuminance * (iso / 100))
lightmeterState.value = lightmeterState.value.copy( lightmeterState.value = lightmeterState.value.copy(
illuminance = illuminance,
iso = iso, iso = iso,
aperture = aperture, aperture = aperture,
shutterSpeed = shutterSpeed shutterSpeed = shutterSpeed
) )
} }
private fun updateLightmeterState(illuminance: Double) {
lightmeterState.value = lightmeterState.value.copy(
illuminance = illuminance
)
recalculateShutterSpeed()
}
override fun onSensorChanged(event: SensorEvent?) { override fun onSensorChanged(event: SensorEvent?) {
event?.values?.let { event?.values?.let {
for (v in it) { for (v in it) {
@@ -138,9 +148,8 @@ fun LightmeterListItemPreview() {
} }
} }
// TODO: Recalculate state on change
@Composable @Composable
fun IsoSlider(state: MutableState<LightmeterState>) { fun IsoSlider(state: MutableState<LightmeterState>, recalculateShutterSpeed: () -> Unit) {
Row( Row(
modifier = Modifier.padding(all = 8.dp), modifier = Modifier.padding(all = 8.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
@@ -154,6 +163,7 @@ fun IsoSlider(state: MutableState<LightmeterState>) {
value = state.value.iso.toFloat(), value = state.value.iso.toFloat(),
onValueChange = { value -> onValueChange = { value ->
state.value = state.value.copy(iso = value.roundToInt()) state.value = state.value.copy(iso = value.roundToInt())
recalculateShutterSpeed()
}, },
valueRange = 1f..2000f valueRange = 1f..2000f
) )
@@ -169,19 +179,24 @@ val previewlightmeterState = mutableStateOf(
) )
) )
fun previewRecalculateShutterSpeed() {}
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
fun IsoSliderPreview() { fun IsoSliderPreview() {
LightMeterTheme { LightMeterTheme {
IsoSlider( IsoSlider(
state = remember { previewlightmeterState } state = remember { previewlightmeterState },
recalculateShutterSpeed = { previewRecalculateShutterSpeed() }
) )
} }
} }
// TODO: Recalculate state on change
@Composable @Composable
fun ApertureSlider(state: MutableState<LightmeterState>) { fun ApertureSlider(
state: MutableState<LightmeterState>,
recalculateShutterSpeed: () -> Unit
) {
Row( Row(
modifier = Modifier.padding(all = 8.dp), modifier = Modifier.padding(all = 8.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
@@ -195,6 +210,7 @@ fun ApertureSlider(state: MutableState<LightmeterState>) {
value = state.value.aperture.toFloat(), value = state.value.aperture.toFloat(),
onValueChange = { value -> onValueChange = { value ->
state.value = state.value.copy(aperture = value.toDouble()) state.value = state.value.copy(aperture = value.toDouble())
recalculateShutterSpeed()
}, },
valueRange = 0.85f..22f valueRange = 0.85f..22f
) )
@@ -205,12 +221,18 @@ fun ApertureSlider(state: MutableState<LightmeterState>) {
@Composable @Composable
fun ApertureSliderPreview() { fun ApertureSliderPreview() {
LightMeterTheme { LightMeterTheme {
ApertureSlider(state = remember { previewlightmeterState }) ApertureSlider(
state = remember { previewlightmeterState },
recalculateShutterSpeed = { previewRecalculateShutterSpeed() }
)
} }
} }
@Composable @Composable
fun LightmeterHomeScreen(state: MutableState<LightmeterState>) { fun LightmeterHomeScreen(
state: MutableState<LightmeterState>,
recalculateShutterSpeed: () -> Unit
) {
Column(modifier = Modifier Column(modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(top = 64.dp) .padding(top = 64.dp)
@@ -245,8 +267,14 @@ fun LightmeterHomeScreen(state: MutableState<LightmeterState>) {
modifier = Modifier.padding(top = 64.dp), modifier = Modifier.padding(top = 64.dp),
verticalArrangement = Arrangement.Bottom verticalArrangement = Arrangement.Bottom
) { ) {
IsoSlider(state = state) IsoSlider(
ApertureSlider(state = state) state = state,
recalculateShutterSpeed = recalculateShutterSpeed
)
ApertureSlider(
state = state,
recalculateShutterSpeed = recalculateShutterSpeed
)
} }
} }
} }
@@ -256,7 +284,8 @@ fun LightmeterHomeScreen(state: MutableState<LightmeterState>) {
fun LightmeterHomeScreenPreview() { fun LightmeterHomeScreenPreview() {
LightMeterTheme { LightMeterTheme {
LightmeterHomeScreen( LightmeterHomeScreen(
state = remember { previewlightmeterState } state = remember { previewlightmeterState },
recalculateShutterSpeed = { previewRecalculateShutterSpeed() }
) )
} }
} }