Метод dispatchRawDelta
Метод dispatchRawDelta класса
DraggableState
принимает смещение по оси перетаскивания.
Его вызывает модификатор
draggable
или ваш код, если delta приходит из другого источника.
Колбэк
rememberDraggableState
получает тот же delta после dispatch.
Синтаксис
dragState.dispatchRawDelta(delta)
Параметры
| Параметр | Описание |
|---|---|
delta |
Смещение в пикселях вдоль оси draggable.
Положительное и отрицательное направление
зависит от Orientation.
|
Пример
Давайте сдвинем плашку draggable и накопим offset в колбэке:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.draggable
import androidx.compose.foundation.gestures.rememberDraggableState
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import kotlin.math.roundToInt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var offsetX by remember { mutableFloatStateOf(0f) }
val dragState = rememberDraggableState { delta ->
offsetX += delta
}
Text(
text = "abcde",
modifier = Modifier
.offset { IntOffset(offsetX.roundToInt(), 0) }
.draggable(
orientation = Orientation.Horizontal,
state = dragState,
)
.background(Color.LightGray)
.padding(16.dp),
)
}
}
}
На экране при перетаскивании draggable внутри state вызовется dispatchRawDelta, и плашка сдвинется.
Пример
Давайте вручную подадим delta через dispatchRawDelta:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.offset
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.foundation.gestures.rememberDraggableState
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.IntOffset
import kotlin.math.roundToInt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var offsetX by remember { mutableFloatStateOf(0f) }
val dragState = rememberDraggableState { delta ->
offsetX += delta
}
Column {
Text(
text = "12345",
modifier = Modifier.offset {
IntOffset(offsetX.roundToInt(), 0)
},
)
Button(
onClick = { dragState.dispatchRawDelta(40f) },
) {
Text(text = "abcde")
}
}
}
}
}
На экране по нажатию на кнопку текст "12345"
сдвинется вправо на фиксированный шаг.
Смотрите также
-
класс
DraggableState,
у которого вызывают dispatchRawDelta -
функция
rememberDraggableState,
которая создаёт state с колбэком delta -
метод
draggable,
который сам вызывает dispatch при жесте -
метод
detectDragGestures,
откуда delta можно передать в state вручную