Pointer event
取得所有手指事件
1
val event = awaitPointerEvent()
| 動態 | pressed | previousPressed | 意義 |
|---|---|---|---|
| 按下 | true | false | 手指剛接觸屏幕 |
| 按下並滑動 | true | true | 手指一直按著 |
| 放開 | false | true | 手指剛離開屏幕 |
| 已抬起 | false | false | 手指已經離開 |
change.id // 手指 ID
change.id.value // Long 類型的手指 ID
change.pressed // 是否按下 (Boolean)
change.previousPressed // 上一次事件時是否按下
change.position // 當前按下位置 (Offset)
change.previousPosition // 上一次按下位置(Offset)
// 位置變化方法
change.positionChanged() // 位置是否改變 (Boolean)
change.positionChange() // 位置變化量 (Offset) = position 按下位置 - previousPosition 上一個按下位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Composable
fun PointerEventExample() {
var state by remember { mutableStateOf("") }
var info by remember { mutableStateOf("") }
Box(
modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val event = awaitPointerEvent()
event.changes.forEach { change ->
info = buildString {
appendLine("id = ${change.id.value}")
appendLine("postion = ${change.position}")
appendLine("previousPosition =${change.previousPosition}")
appendLine("手指一直按並滑動 = ${change.positionChange()}")
appendLine("是否滑動 = ${change.positionChanged()}")
}
when {
change.pressed && !change.previousPressed ->
state = "按下"
!change.pressed && change.previousPressed ->
state = "放開"
change.pressed && change.previousPressed ->
state = "手指一直按"
else ->
state = "沒動作"
}
}
}
}
}
) {
Column {
Text("state = $state")
Text("info = $info")
}
}
}
只取得按下事件
| 特性 | awaitFirstDown() | awaitPointerEvent() |
|---|---|---|
| 等待類型 | 只等待按下事件 | 等待任何事件(按下、移動、抬起) |
| 返回內容 | 單一 PointerInputChange | PointerEvent 包含所有觸摸點 |
| 篩選能力 | 自動篩選按下事件 | 需要手動判斷事件類型 |
| 使用場景 | 檢測點擊開始 | 需要處理所有事件 |

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Composable
fun PointerEventExample2() {
var info by remember { mutableStateOf("") }
Box(
modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
val down = awaitFirstDown()
info = buildString {
appendLine("id = ${down.id}")
appendLine("position = ${down.position}")
appendLine("time = ${down.uptimeMillis}")
}
}
}
}
) {
Column {
Text("info = $info")
}
}
}