Я пытаюсь сделать перетаскиваемую коробку внутри масштабированного (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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Извлечение индекса Херста из fBM с использованием масштабированного диапазона (R/S)
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-