טיפול בקלט לא ישיר של מצביעים ב-Jetpack Compose Glimmer

מכשירי XR רלוונטיים
ההנחיות האלה יעזרו לכם ליצור חוויות למכשירי XR מהסוגים הבאים.
משקפיים עם תצוגה פנימית

המשתנה onIndirectPointerGesture מאפשר לרכיב לקבל אירועים עקיפים ברמה גבוהה של הסמן ולהגיב להם, כמו אירועים שמקורם בלוח המגע של המכשיר. משתמשים ב-modifier הזה כדי לתעד ולעבד תנועות שמגיעות מלוח מגע או ממקור דומה.

פלטפורמת ה-API

יש ארבעה קריאות חוזרות (callbacks) שהאפליקציה יכולה להשתמש בהן כדי לשלוט בטיפול:

  • ‫onClick: מופעלת כשמתבצעת לחיצה או נגיעה בלי תנועה אופקית משמעותית.
  • ‫onSwipeForward: מופעל כשמחליקים לרוחב ועוברים את סף המרחק והמהירות בכיוון קדימה.
  • ‫onSwipeBackward: מופעל כשמחליקים אופקית אחורה מעבר לסף המרחק והמהירות.
  • ‫Enabled: אם הפרמטר מוגדר ל-false, המערכת מתעלמת מהעיבוד ולא מפעילה קריאות חוזרות (callback).

התנהגות המערכת בהחלקה ובגלילה

המערכת משתמשת בסף של סטיית מגע כדי להבדיל בין קליק להחלקה.

  • אם הסמן זז באופן משמעותי כשהוא במצב לחיצה, הפעולה onClick מבוטלת.
  • אם הסמן חוזר אחורה באופן משמעותי במהלך התנועה, תנועת ההחלקה לא תזוהה.

דוגמה: הגדרת טיפול בהחלקות ובקליקים על רכיב

הקוד הבא מגדיר את הטיפול בהחלקות ובקליקים על Box שניתן להתמקד בו:

@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")
    }
}

מידע חשוב על הקוד

  • הרכיב onIndirectPointerGesture דורש מיקוד, ולכן גם focusTarget מוחל כדי שניתן יהיה להתמקד ב-Box. אפשר להשתמש ב-focusTarget או במקש צירוף אחר שמאפשר התמקדות, כמו surface. בלי מיקוד, המקש המשתנה לא יכול לפעול על אירועים עקיפים של הסמן.
  • בדוגמה הזו מוטמעות גם פונקציות ה-callback של onSwipeForward וגם של onClick, כך שתנועות החלקה ולחיצה שזוהו נתפסות ומנוצלות, ולא מגיעות החוצה למאגרי הנתונים ההורה. עם זאת, אפשר גם להשאיר קריאה חוזרת ספציפית כ-null כדי להעביר תנועה ל-modifier של onIndirectPointerGesture בקונטיינר הורה.