Метод detectTapGestures
Метод detectTapGestures вызывают
внутри
PointerInputScope,
то есть в лямбде
pointerInput.
Это suspend-функция: она ждёт события указателя,
пока composable на экране.
Короткое нажатие передают в onTap,
долгое - в onLongPress.
Синтаксис
detectTapGestures(
onTap = { offset -> },
)
Параметры
| Параметр | Описание |
|---|---|
onTap |
Лямбда с координатой нажатия. Вызывается при отпускании. |
onDoubleTap |
Лямбда при двойном tap. |
onLongPress |
Лямбда при долгом нажатии. |
onPress |
Suspend-лямбда в момент касания до отпускания. |
Пример
Давайте сменим текст по одиночному tap:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
Text(
text = label,
modifier = Modifier.pointerInput(Unit) {
detectTapGestures {
label = if (label == "abcde") "12345" else "abcde"
}
},
)
}
}
}
На экране каждое нажатие по тексту
переключит "abcde" и "12345".
Пример
Давайте сменим текст только по double tap:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.material3.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var label by remember { mutableStateOf("abcde") }
Text(
text = label,
modifier = Modifier.pointerInput(Unit) {
detectTapGestures(
onDoubleTap = {
label = if (label == "abcde") "12345" else "abcde"
},
)
},
)
}
}
}
На экране один tap ничего не сделает, а двойной сменит строку на экране.
Смотрите также
-
метод
detectDragGestures,
который ловит перетаскивание вместо tap -
класс
PointerInputScope,
где вызывают detectTapGestures -
метод
pointerInput,
который открывает область для detect-методов -
метод
clickable,
который даёт tap с ripple без pointerInput