From 6aff6c8683df29fa5a64f19e8bd0d40b53f86e89 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Wed, 3 Apr 2024 20:41:30 +0200 Subject: [PATCH] feat: Make audio bar's sensitivity changeable by pinching (closes #99) Signed-off-by: Myzel394 <50424412+Myzel394@users.noreply.github.com> --- .../atoms/RealTimeAudioVisualizer.kt | 18 ++++++++++++++++-- .../organisms/AudioRecordingStatus.kt | 1 - 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/RealTimeAudioVisualizer.kt b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/RealTimeAudioVisualizer.kt index b2d0808..cf4c873 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/RealTimeAudioVisualizer.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/RealTimeAudioVisualizer.kt @@ -4,11 +4,16 @@ import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas +import androidx.compose.foundation.gestures.rememberTransformableState +import androidx.compose.foundation.gestures.transformable import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset @@ -75,7 +80,15 @@ fun RealtimeAudioVisualizer( audioRecorder.setMaxAmplitudesAmount(ceil(availableSpace.toInt() / BOX_DIFF).toInt() + 1) } - Canvas(modifier = modifier) { + var scale by remember { mutableFloatStateOf(1f) } + val transformState = rememberTransformableState { zoomChange, _, _ -> + scale *= zoomChange + } + val amplitudePercentageModifier = MAX_AMPLITUDE * (1 / scale) + + Canvas( + modifier = modifier.transformable(transformState), + ) { val height = this.size.height / 2f val width = this.size.width @@ -88,7 +101,8 @@ fun RealtimeAudioVisualizer( val horizontalProgress = ( clamp(horizontalValue, GROW_START, GROW_END) - GROW_START) / (GROW_END - GROW_START) - val amplitudePercentage = (amplitude.toFloat() / MAX_AMPLITUDE).coerceAtMost(1f) + val amplitudePercentage = + (amplitude.toFloat() / amplitudePercentageModifier).coerceAtMost(1f) val boxHeight = (height * amplitudePercentage * horizontalProgress).coerceAtLeast(15f) diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/AudioRecordingStatus.kt b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/AudioRecordingStatus.kt index 673e573..893b450 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/AudioRecordingStatus.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/organisms/AudioRecordingStatus.kt @@ -38,7 +38,6 @@ import java.time.LocalDateTime fun AudioRecordingStatus( audioRecorder: AudioRecorderModel, ) { - val context = LocalContext.current val configuration = LocalConfiguration.current.orientation var now by remember { mutableStateOf(LocalDateTime.now()) }