Как создать перетаскиваемый и вращаемый блок в Jetpack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как создать перетаскиваемый и вращаемый блок в Jetpack Compose?

Сообщение Anonymous »

Я работаю над приложением Jetpack Compose и хочу создать блок, который можно как перетаскивать, так и вращать с помощью мыши. Я должен иметь возможность щелкнуть и перетащить весь блок, чтобы переместить его по экрану. также я хочу добавить небольшую ручку в верхней центральной части коробки. Когда я перетаскиваю этот маркер, Box должен вращаться вокруг своего центра.
Вот что я пробовал:

Код: Выделить всё

@Composable
fun DragRotateBox() {

var rotation by remember { mutableStateOf(0f) }
var position by remember { mutableStateOf(Offset.Zero) }

var initialTouch = Offset.Zero

val boxSize = 100.dp
val handleSize = 20.dp

val boxSizePx = with(LocalDensity.current) { boxSize.toPx() }

val center = Offset(boxSizePx, boxSizePx)

// Main Box
Box(
modifier = Modifier
.graphicsLayer(
rotationZ = rotation,
translationX = position.x,
translationY = position.y
)
.background(Color.Blue)
.size(boxSize)
.pointerInput(Unit) {
detectDragGestures(
onDrag = {change, dragAmount ->
change.consume()
position += dragAmount
}
)
}
) {
// Rotation handler
Box(
modifier = Modifier
.size(handleSize)
.background(Color.Red)
.align(Alignment.TopCenter)
.pointerInput(Unit) {
detectDragGestures(
onDragStart = { offset ->
initialTouch = offset
},
onDrag = { change, dragAmount ->
change.consume()

val angle = calculateRotationAngle(center, initialTouch, change.position)
rotation += angle
}
)
}
)
}
}
// Generated by ChatGPT!
fun calculateRotationAngle(pivot: Offset, initialTouch: Offset, currentTouch: Offset): Float {
val initialVector = initialTouch - pivot
val currentVector = currentTouch - pivot

val initialAngle = atan2(initialVector.y, initialVector.x)
val currentAngle = atan2(currentVector.y, currentVector.x)

return Math.toDegrees((currentAngle - initialAngle).toDouble()).toFloat()
}
Перетаскивание и вращение работают нормально, если реализованы по отдельности, но когда я пытаюсь объединить перетаскивание и вращение, взаимодействие не работает должным образом.
Вот демонстрация проблемы:
Изображение

Я уверен, что что-то упускаю. Может ли кто-нибудь помочь мне с этим?

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

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

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

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

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

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