Recalculate shutter speed on ISO and aperture changes
This commit is contained in:
@@ -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() }
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user