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

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

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

פלטפורמת ה-API

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

  • 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. אם אין מיקוד, אי אפשר להשתמש במאפיין modifier כדי להשפיע על אירועים עקיפים של הצבעה.
  • בדוגמה הזו מיושמים גם קריאות החזרה (callback) של onSwipeForward וגם של onClick, כך שמחוות של החלקה וקליק שמזוהות נחטפות ונצרכות, ולא מגיעות אל מחוץ למאגרי התגים של ההורה. אבל אפשר גם להשאיר קריאה חוזרת ספציפית כ-null כדי להעביר תנועה אל onIndirectPointerGesture modifier במאגר אב.