Я пытаюсь сделать перетаскиваемую коробку внутри масштабированного (Via .graphicsLayer Modifier).
Вот мой код для масштабируемого контейнера: < /p>
@Composable
private fun DraggablePlan(
modifier: Modifier = Modifier,
initialWidth: Dp? = null,
initialOffset: Offset = Offset(0f, 0f),
initialScale: Float = 1f,
minScale: Float = 1f,
maxScale: Float = 8f,
) {
// Mutable state variables to hold scale and offset values
var scale by remember { mutableFloatStateOf(initialScale) }
// Offsets are from top-left hand corner and they are scaled related
var offsetX by remember { mutableFloatStateOf(initialOffset.x) }
var offsetY by remember { mutableFloatStateOf(initialOffset.y) }
// Plan container (used as touch zone)
Box(
modifier
.pointerInput(Unit) {
detectTransformGestures(
onGesture = { centroid, pan, gestureZoom, _ ->
val oldScale = scale
val newScale = (scale * gestureZoom).coerceIn(minScale, maxScale)
// Calculate the new offset considering the centroid and pan.
val rawOffset = Offset(offsetX, offsetY)
val adjustedOffset = (centroid / newScale + pan / oldScale) - (centroid / oldScale - rawOffset)
// Compute bounds for horizontal and vertical scaling.
val boundX = (size.width.toFloat() - (initialWidth?.toPx() ?: size.width.toFloat()) * newScale) / newScale
val boundY = (size.height.toFloat() - (initialWidth?.toPx() ?: size.width.toFloat()) * newScale) / newScale
// Apply bounds to offsetX and offsetY.
offsetX = adjustedOffset.x.coerceIn(boundX.coerceAtMost(0f), boundX.coerceAtLeast(0f))
offsetY = adjustedOffset.y.coerceIn(boundY.coerceAtMost(0f), boundY.coerceAtLeast(0f))
// Update the scale.
scale = newScale
},
)
}.fillMaxSize(),
) {
// Plan
Box(
Modifier
// Apply transformations
.graphicsLayer(
scaleX = scale,
scaleY = scale,
translationX = offsetX * scale,
translationY = offsetY * scale,
transformOrigin = TransformOrigin(0f, 0f),
).conditionalInitialWidth(initialWidth)
.aspectRatio(1f)
.background(brush = Brush.horizontalGradient(listOf(Color.Red, Color.Yellow, Color.Green, Color.Blue))),
) {
Wall()
}
}
}
< /code>
А вот моя "стена" композиционная: < /p>
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun Wall(modifier: Modifier = Modifier) {
// Set up all transformation states
var childOffsetX by remember { mutableFloatStateOf(100f) }
var childOffsetY by remember { mutableFloatStateOf(100f) }
Box(
Modifier
.offset { IntOffset(childOffsetX.roundToInt(), childOffsetY.roundToInt()) }
.draggable2D(
onDragStarted = { Log.w("MALBEC", "dragStart") },
state =
rememberDraggable2DState { delta ->
childOffsetX += delta.x
childOffsetY += delta.y
},
).clickable { Log.w("MALBEC", "clickable") }
.width(50.dp)
.height(50.dp)
.background(Color.White),
)
}
< /code>
К сожалению, я не могу заставить его работать ... Фактически, я могу перетаскивать свою стену, когда масштаб = 1, но когда масштаб> 1, перетаскивание не запускается, поскольку «зона сенсорной зоны» не является соответствующим образом масштабируется с помощью GraphicsLayer. Я заметил, что. Кликабельный модификатор работает хорошо, даже когда масштабируется. < /P>
Заранее,
corentin < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... r-modifier
Сделайте перетаскиваемую коробку внутри масштабированного модификатора GraphicsLayer ⇐ Android
Форум для тех, кто программирует под Android
1744967498
Anonymous
Я пытаюсь сделать перетаскиваемую коробку внутри масштабированного (Via .graphicsLayer Modifier).
Вот мой код для масштабируемого контейнера: < /p>
@Composable
private fun DraggablePlan(
modifier: Modifier = Modifier,
initialWidth: Dp? = null,
initialOffset: Offset = Offset(0f, 0f),
initialScale: Float = 1f,
minScale: Float = 1f,
maxScale: Float = 8f,
) {
// Mutable state variables to hold scale and offset values
var scale by remember { mutableFloatStateOf(initialScale) }
// Offsets are from top-left hand corner and they are scaled related
var offsetX by remember { mutableFloatStateOf(initialOffset.x) }
var offsetY by remember { mutableFloatStateOf(initialOffset.y) }
// Plan container (used as touch zone)
Box(
modifier
.pointerInput(Unit) {
detectTransformGestures(
onGesture = { centroid, pan, gestureZoom, _ ->
val oldScale = scale
val newScale = (scale * gestureZoom).coerceIn(minScale, maxScale)
// Calculate the new offset considering the centroid and pan.
val rawOffset = Offset(offsetX, offsetY)
val adjustedOffset = (centroid / newScale + pan / oldScale) - (centroid / oldScale - rawOffset)
// Compute bounds for horizontal and vertical scaling.
val boundX = (size.width.toFloat() - (initialWidth?.toPx() ?: size.width.toFloat()) * newScale) / newScale
val boundY = (size.height.toFloat() - (initialWidth?.toPx() ?: size.width.toFloat()) * newScale) / newScale
// Apply bounds to offsetX and offsetY.
offsetX = adjustedOffset.x.coerceIn(boundX.coerceAtMost(0f), boundX.coerceAtLeast(0f))
offsetY = adjustedOffset.y.coerceIn(boundY.coerceAtMost(0f), boundY.coerceAtLeast(0f))
// Update the scale.
scale = newScale
},
)
}.fillMaxSize(),
) {
// Plan
Box(
Modifier
// Apply transformations
.graphicsLayer(
scaleX = scale,
scaleY = scale,
translationX = offsetX * scale,
translationY = offsetY * scale,
transformOrigin = TransformOrigin(0f, 0f),
).conditionalInitialWidth(initialWidth)
.aspectRatio(1f)
.background(brush = Brush.horizontalGradient(listOf(Color.Red, Color.Yellow, Color.Green, Color.Blue))),
) {
Wall()
}
}
}
< /code>
А вот моя "стена" композиционная: < /p>
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun Wall(modifier: Modifier = Modifier) {
// Set up all transformation states
var childOffsetX by remember { mutableFloatStateOf(100f) }
var childOffsetY by remember { mutableFloatStateOf(100f) }
Box(
Modifier
.offset { IntOffset(childOffsetX.roundToInt(), childOffsetY.roundToInt()) }
.draggable2D(
onDragStarted = { Log.w("MALBEC", "dragStart") },
state =
rememberDraggable2DState { delta ->
childOffsetX += delta.x
childOffsetY += delta.y
},
).clickable { Log.w("MALBEC", "clickable") }
.width(50.dp)
.height(50.dp)
.background(Color.White),
)
}
< /code>
К сожалению, я не могу заставить его работать ... Фактически, я могу перетаскивать свою стену, когда масштаб = 1, но когда масштаб> 1, перетаскивание не запускается, поскольку «зона сенсорной зоны» не является соответствующим образом масштабируется с помощью GraphicsLayer. Я заметил, что. Кликабельный модификатор работает хорошо, даже когда масштабируется. < /P>
Заранее,
corentin < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79552913/make-a-draggable-box-inside-scaled-graphicslayer-modifier[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия