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