Created
April 28, 2023 11:39
-
-
Save avwie/2248cd9642f7d8f3a60347f4b4495ac4 to your computer and use it in GitHub Desktop.
A minimal example showing the lagging drag issue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
And an accompanying screencast:
Screen.Recording.2023-04-28.at.13.41.29.mov