DocumentScreen: make the image zoomable

This commit is contained in:
Pierre-Yves Nicolas
2025-06-21 15:39:33 +02:00
parent 5b777e5edc
commit 60d5bc51ef
3 changed files with 17 additions and 3 deletions

View File

@@ -68,6 +68,7 @@ dependencies {
implementation(libs.opencv) implementation(libs.opencv)
implementation(libs.pdfbox) implementation(libs.pdfbox)
implementation(libs.icons.extended) implementation(libs.icons.extended)
implementation(libs.zoomable)
testImplementation(libs.junit) testImplementation(libs.junit)
testImplementation(libs.assertj) testImplementation(libs.assertj)

View File

@@ -33,7 +33,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
@@ -54,17 +53,21 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableIntState import androidx.compose.runtime.MutableIntState
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import net.engawapg.lib.zoomable.rememberZoomState
import net.engawapg.lib.zoomable.zoomable
import org.mydomain.myscan.ui.theme.MyScanTheme import org.mydomain.myscan.ui.theme.MyScanTheme
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@@ -147,13 +150,21 @@ private fun DocumentPreview(
Box ( Box (
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
// TODO Make it possible to zoom on the image val bitmap = imageLoader(imageId)
val imageBitmap = bitmap.asImageBitmap()
val zoomState = rememberZoomState(
contentSize = Size(bitmap.width.toFloat(), bitmap.height.toFloat()))
LaunchedEffect(imageId) {
zoomState.reset()
}
Image( Image(
bitmap = imageLoader(imageId).asImageBitmap(), bitmap = imageBitmap,
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
.padding(4.dp) .padding(4.dp)
.align(Alignment.Center) .align(Alignment.Center)
.zoomable(zoomState)
) )
SmallFloatingActionButton( SmallFloatingActionButton(
onClick = { onDeleteImage(imageId) }, onClick = { onDeleteImage(imageId) },

View File

@@ -14,6 +14,7 @@ litert = "1.2.0"
opencv = "4.11.0" opencv = "4.11.0"
assertj = "3.27.3" assertj = "3.27.3"
pdfbox = "2.0.27.0" pdfbox = "2.0.27.0"
zoomable = "2.8.0"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -43,6 +44,7 @@ litert-support = { group = "com.google.ai.edge.litert", name = "litert-support",
litert-metadata = { group = "com.google.ai.edge.litert", name = "litert-metadata", version.ref = "litert" } litert-metadata = { group = "com.google.ai.edge.litert", name = "litert-metadata", version.ref = "litert" }
opencv = { group="org.opencv", name="opencv", version.ref = "opencv" } opencv = { group="org.opencv", name="opencv", version.ref = "opencv" }
pdfbox = { group = "com.tom-roush", name = "pdfbox-android", version.ref = "pdfbox" } pdfbox = { group = "com.tom-roush", name = "pdfbox-android", version.ref = "pdfbox" }
zoomable = { group = "net.engawapg.lib", name = "zoomable", version.ref = "zoomable" }
assertj = { group="org.assertj", name="assertj-core", version.ref = "assertj" } assertj = { group="org.assertj", name="assertj-core", version.ref = "assertj" }