CameraScreen: better capture button

This commit is contained in:
Pierre-Yves Nicolas
2025-06-08 20:14:01 +02:00
parent d14de65d00
commit 271f047c9d

View File

@@ -33,6 +33,11 @@ import androidx.camera.core.resolutionselector.ResolutionSelector
import androidx.camera.lifecycle.ProcessCameraProvider import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
import androidx.compose.foundation.Canvas import androidx.compose.foundation.Canvas
import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -40,7 +45,9 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
@@ -62,6 +69,7 @@ import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@@ -91,6 +99,7 @@ fun CameraScreen(
val showPageDialog = rememberSaveable { mutableStateOf(false) } val showPageDialog = rememberSaveable { mutableStateOf(false) }
val isProcessing = rememberSaveable { mutableStateOf(false) } val isProcessing = rememberSaveable { mutableStateOf(false) }
val pageToValidate by viewModel.pageToValidate.collectAsStateWithLifecycle() val pageToValidate by viewModel.pageToValidate.collectAsStateWithLifecycle()
val pageCount = viewModel.pageCount()
val context = LocalContext.current val context = LocalContext.current
val requestPermissionLauncher = rememberLauncherForActivityResult( val requestPermissionLauncher = rememberLauncherForActivityResult(
@@ -116,7 +125,7 @@ fun CameraScreen(
Box(modifier = modifier.fillMaxSize()) { Box(modifier = modifier.fillMaxSize()) {
CameraPreviewWithOverlay(onImageAnalyzed, captureController, liveAnalysisState) CameraPreviewWithOverlay(onImageAnalyzed, captureController, liveAnalysisState)
MessageBox(liveAnalysisState.inferenceTime) MessageBox(liveAnalysisState.inferenceTime)
Button( CaptureButton(
onClick = { onClick = {
showPageDialog.value = true showPageDialog.value = true
isProcessing.value = true isProcessing.value = true
@@ -130,13 +139,12 @@ fun CameraScreen(
Log.e("MyScan", "Error during image capture") Log.e("MyScan", "Error during image capture")
} }
} }
)}, )
modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 96.dp), },
) { modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 96.dp)
Text("Capture") )
}
CameraScreenFooter( CameraScreenFooter(
pageCount = viewModel.pageCount(), pageCount = pageCount,
onFinalizePressed = onFinalizePressed, onFinalizePressed = onFinalizePressed,
modifier = Modifier.align(Alignment.BottomCenter)) modifier = Modifier.align(Alignment.BottomCenter))
} }
@@ -159,6 +167,36 @@ fun CameraScreen(
} }
} }
@Composable
fun CaptureButton(onClick: () -> Unit, modifier: Modifier) {
val color = MaterialTheme.colorScheme.primary
Box(
modifier = modifier
.size(80.dp)
.clickable(
interactionSource = remember { MutableInteractionSource() },
indication = LocalIndication.current,
onClick = onClick
),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier
.size(72.dp)
.border(
width = 4.dp,
color = color.copy(alpha = 0.5f),
shape = CircleShape
)
)
Box(
modifier = Modifier
.size(60.dp)
.background(color = color, shape = CircleShape)
)
}
}
@Composable @Composable
private fun CameraPreviewWithOverlay( private fun CameraPreviewWithOverlay(
onImageAnalyzed: (ImageProxy) -> Unit, onImageAnalyzed: (ImageProxy) -> Unit,