DraggableView.kt 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package eu.mjdev.desktop.components.draggable
  2. import androidx.compose.foundation.background
  3. import androidx.compose.foundation.gestures.detectDragGestures
  4. import androidx.compose.foundation.layout.Box
  5. import androidx.compose.foundation.layout.BoxScope
  6. import androidx.compose.foundation.layout.PaddingValues
  7. import androidx.compose.foundation.layout.padding
  8. import androidx.compose.runtime.*
  9. import androidx.compose.ui.Modifier
  10. import androidx.compose.ui.geometry.Offset
  11. import androidx.compose.ui.graphics.Color
  12. import androidx.compose.ui.graphics.graphicsLayer
  13. import androidx.compose.ui.input.pointer.pointerInput
  14. import androidx.compose.ui.unit.dp
  15. @Composable
  16. fun DraggableView(
  17. modifier: Modifier = Modifier,
  18. dragEnabled: Boolean = true,
  19. backgroundColor: Color = Color.Transparent,
  20. dragBackgroundColor: Color = Color.White.copy(alpha = 0.3f),
  21. contentPadding: PaddingValues = PaddingValues(0.dp),
  22. content: @Composable BoxScope.() -> Unit = {}
  23. ) {
  24. var position by remember { mutableStateOf(Offset.Zero) }
  25. var isDragging by remember { mutableStateOf(false) }
  26. Box(
  27. modifier = modifier
  28. .graphicsLayer(
  29. translationX = position.x,
  30. translationY = position.y
  31. )
  32. .pointerInput(Unit) {
  33. detectDragGestures(
  34. onDrag = { change, dragAmount ->
  35. if (dragEnabled) {
  36. change.consume()
  37. position += dragAmount
  38. }
  39. },
  40. onDragStart = {
  41. isDragging = true
  42. },
  43. onDragEnd = {
  44. isDragging = false
  45. }
  46. )
  47. }.padding(contentPadding),
  48. content = {
  49. Box(
  50. modifier = Modifier
  51. .background(if (isDragging) dragBackgroundColor else backgroundColor)
  52. ) {
  53. content()
  54. }
  55. }
  56. )
  57. }