Skip to content

Instantly share code, notes, and snippets.

@avwie
Created April 28, 2023 11:39
Show Gist options
  • Save avwie/2248cd9642f7d8f3a60347f4b4495ac4 to your computer and use it in GitHub Desktop.
Save avwie/2248cd9642f7d8f3a60347f4b4495ac4 to your computer and use it in GitHub Desktop.
A minimal example showing the lagging drag issue
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.gestures.onDrag
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
fun main() = application {
Window(onCloseRequest = ::exitApplication) {
DragDropExample()
}
}
data class Entity(
val offset: DpOffset
)
@Composable fun DragDropExample() {
var entity by remember { mutableStateOf(Entity(DpOffset(100.dp, 100.dp))) }
Canvas(
modifier = Modifier.fillMaxSize()
) {
drawRect(Color.White)
}
Entity(
state = entity,
onDrag = {
entity = entity.copy(offset = entity.offset + it)
}
)
}
@OptIn(ExperimentalFoundationApi::class)
@Composable fun Entity(
state: Entity,
onDragStart: () -> Unit = {},
onDrag: (DpOffset) -> Unit = {},
onDragEnd: () -> Unit = {}
) {
with (LocalDensity.current) {
Box(
modifier = Modifier
.offset { IntOffset(x = state.offset.x.toPx().toInt(), y = state.offset.y.toPx().toInt()) }
.onDrag(
onDragStart = {
onDragStart()
},
onDrag = { onDrag(DpOffset(x = it.x.toDp(), y = it.y.toDp())) },
onDragEnd = { onDragEnd() }
)
) {
Canvas(
modifier = Modifier.size(100.dp)
) {
drawRect(Color.Red)
}
}
}
}
@avwie
Copy link
Author

avwie commented Apr 28, 2023

And an accompanying screencast:

Screen.Recording.2023-04-28.at.13.41.29.mov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment