Невозможно достичь масштабирования в JetPack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Невозможно достичь масштабирования в JetPack Compose

Сообщение Anonymous »

Zoom не работает должным образом в Android JetPack Compose. Изображение находится внутри горизонтального пейджера. Когда изображение перемещается внутри контейнера, горизонтальный пейджер, естественно, перестает работать, но когда пользователь увеличивает масштаб, изображение не отрывается назад в исходном положении, чтобы заставить ViewPager снова работать. < /P>
HorizontalPager(state, modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.CenterVertically) { page->
ImageViewer(images = storeImages.value, page=page, pagerState= state, scope=scope)
}

@OptIn(ExperimentalGlideComposeApi::class)
@Composable
fun ImageViewer(images: List, page: Int, pagerState: PagerState, scope: CoroutineScope) {
var imageSize by remember { mutableStateOf(IntSize.Zero) }
var scale by remember { mutableStateOf(1f) }
var offset by remember { mutableStateOf(Offset.Zero) }
Log.d("scale", "ImageViewer: $scale")
Log.d("offset", "ImageViewer: ${offset.x}, ${offset.y}")
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
Column(modifier = Modifier
.fillMaxSize()
.align(alignment = Alignment.Center)) {
GlideImage(
contentScale = ContentScale.FillWidth,
model = images[page],
contentDescription = "Zoomable Image",
modifier = Modifier
.fillMaxSize()
.onGloballyPositioned { coordinates ->
imageSize = coordinates.size // Capture the image size
}
.pointerInput(Unit) {
detectTransformGestures() { centroid, pan, zoom, _ ->
val newScale = (scale * zoom).coerceIn(1f, 5f) // Limit zoom scale
val newOffset = offset + pan

// Adjust offset based on scale changes
val adjustedOffset = if (scale != newScale) {
// Calculate the difference in size due to scaling
val sizeDifference = (newScale / scale - 1f)
// Calculate the focal point within the *scaled* image
val scaledFocalPoint = (centroid + offset)
// Calculate the offset needed to keep the focal point stationary
val focalPointOffset = scaledFocalPoint * sizeDifference

newOffset - focalPointOffset
} else {
newOffset
}
scale = newScale
offset = adjustedOffset
}
}
.pointerInput(Unit) { // New pointerInput for horizontal swipe
detectHorizontalDragGestures { change, dragAmount ->
if (scale == 1f) { // Only trigger pager swipe when not zoomed
val currentPosition = pagerState.currentPage
if (dragAmount < 0) { // Left swipe (right to left)
if (currentPosition < images.size - 1) {
scope.launch {
pagerState.animateScrollToPage(currentPosition + 1)
}
}
} else { // Right swipe (left to right)
if (currentPosition > 0) {
scope.launch {
pagerState.animateScrollToPage(currentPosition - 1)
}
}
}
}
}
}
.graphicsLayer(
scaleX = scale,
scaleY = scale,
translationX = offset.x,
translationY = offset.y
)

)
}

}
}

< /code>
Я попытался воспроизвести многокачественный Zoom из Stackoverflow post разработчики Android Doc.
Я также пытался получить исправление от LLM, таких как Chatgpt и Gemini, которые тоже не работают.
Я попытался проверить, возвращается ли изображение в 1F. Но это также не работает, как когда размеры изображения меняют новое состояние после выпуска жеста, становится 1F.
Как обсуждалось выше, я хочу, чтобы изображение вернулось к своему первоначальному состоянию после увеличения, так что горизонтальный пейджер снова начинает работать. /п>

Подробнее здесь: https://stackoverflow.com/questions/794 ... ck-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»