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