Xử lý phương thức nhập bằng con trỏ gián tiếp trong Jetpack Compose Glimmer

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Kính có màn hình

Đối tượng sửa đổi onIndirectPointerGesture cho phép thành phần nhận và phản hồi các sự kiện con trỏ gián tiếp cấp cao, chẳng hạn như các sự kiện bắt nguồn từ bàn di chuột của thiết bị. Sử dụng đối tượng sửa đổi này để ghi lại và xử lý các cử chỉ đến từ bàn di chuột hoặc nguồn tương tự.

Nền tảng API

Có 4 lệnh gọi lại mà ứng dụng của bạn có thể dùng để kiểm soát việc xử lý:

  • onClick: Được kích hoạt khi người dùng nhấn hoặc nhấp thành công mà không có chuyển động ngang đáng kể.
  • onSwipeForward: Sẽ kích hoạt khi thao tác vuốt ngang vượt quá ngưỡng khoảng cách và vận tốc theo hướng tiến.
  • onSwipeBackward: Được kích hoạt khi thao tác vuốt ngang vượt quá ngưỡng khoảng cách và vận tốc theo hướng lùi.
  • Enabled: Khi được đặt thành false, đối tượng sửa đổi sẽ bị bỏ qua và không có lệnh gọi lại nào được gọi.

Hành vi của hệ thống khi vuốt và cuộn

Hệ thống sử dụng ngưỡng độ dốc chạm để phân biệt giữa thao tác nhấp và thao tác vuốt.

  • Nếu con trỏ di chuyển đáng kể trong trạng thái nhấn xuống, thì onClick sẽ bị huỷ.
  • Nếu con trỏ lùi lại đáng kể trong một chuyển động, thì cử chỉ vuốt sẽ không hợp lệ.

Ví dụ: Thiết lập cách xử lý thao tác vuốt và nhấp vào một thành phần

Đoạn mã sau đây thiết lập cách xử lý thao tác vuốt và nhấp vào một Box có thể làm tâm điểm:

@Composable
fun OnIndirectPointerGestureSample() {
    var lastGesture by remember { mutableStateOf("None") }

    Box(
        modifier =
            Modifier.fillMaxSize()
                .onIndirectPointerGesture(
                    enabled = true,
                    onSwipeForward = { lastGesture = "Forward" },
                    onSwipeBackward = { lastGesture = "Backward" },
                    onClick = { lastGesture = "Click" },
                )
                .focusTarget(),
        contentAlignment = Alignment.Center,
    ) {
        Text("Last Gesture: $lastGesture")
    }
}

Các điểm chính về mã

  • onIndirectPointerGesture cần có tiêu điểm, vì vậy, focusTarget cũng được áp dụng để đặt tiêu điểm cho Box. Bạn có thể sử dụng focusTarget hoặc một đối tượng sửa đổi khác cho phép lấy tiêu điểm, chẳng hạn như surface. Nếu không có tiêu điểm, đối tượng sửa đổi không thể hành động dựa trên các sự kiện con trỏ gián tiếp.
  • Ví dụ này triển khai cả lệnh gọi lại onSwipeForward và onClick, vì vậy, các cử chỉ vuốt và nhấp được phát hiện sẽ bị chặn và sử dụng, đồng thời không tiếp cận được vùng chứa mẹ. Tuy nhiên, bạn cũng có thể để trống một lệnh gọi lại cụ thể để truyền cử chỉ đến đối tượng sửa đổi onIndirectPointerGesture trong vùng chứa mẹ.