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
Невозможно достичь масштабирования в JetPack Compose ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1740488408
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.
Как обсуждалось выше, я хочу, чтобы изображение вернулось к своему первоначальному состоянию после увеличения, так что горизонтальный пейджер снова начинает работать. /п>
Подробнее здесь: [url]https://stackoverflow.com/questions/79466036/unable-to-achive-zoom-in-jetpack-compose[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия