גרירה ושחרור

הכלי 'Jetpack פיתוח נייטיב' תומך בגרירה ושחרור עם שני מגבילי התאמה:

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

לדוגמה, כדי לאפשר למשתמשים לגרור תמונה באפליקציה, צריך ליצור תוכן קומפוזבילי ולהוסיף את הצירוף dragAndDropSource. כדי להגדיר יעד דרופ, צריך ליצור תוכן קומפוזבילי נוסף של תמונה ולהוסיף את הצירוף dragAndDropTarget.

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

מגבילי הצירוף מאפשרים לאפליקציות לשתף נתונים בין שתי תכנים קומפוזביליים או יותר באמצעות ClipData, שניתן לשלב בהטמעות של View.

ציון מקור לגרירה

כדי להפעיל אירועי גרירה בתוך רכיב, צריך להוסיף את מקש הצירוף dragAndDropSource. הפונקציה מקבלת פונקציה כפרמטר. בתוך הפונקציה הזו, משתמשים ב-DragAndDropTransferData כדי לייצג את הנתונים שניתנים להעברה. הנתונים יכולים להיות URI מרוחק, נתוני טקסט עשיר בלוח, קובץ מקומי ועוד, אבל צריך לכלול את כולם באובייקט ClipData. למשל, תוכלו לכתוב טקסט פשוט כך:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                )
            )
        )
    })
}

כדי לאפשר לפעולת הגרירה לעבור את הגבולות של האפליקציה, ה-constructor של DragAndDropTransferData מקבל ארגומנט flags. בדוגמה הבאה, הקבוע DRAG_FLAG_GLOBAL מציין שאפשר לגרור נתונים מאפליקציה אחת לאחרת:

Modifier.dragAndDropSource {
    detectTapGestures(onLongPress = {
        startTransfer(
            DragAndDropTransferData(
                ClipData.newPlainText(
                    "image Url", url
                ),
                flags = View.DRAG_FLAG_GLOBAL
            )
        )
    })
}

DragAndDropTransferData מקבל דגלים שנתמכים על ידי מערכת Android View. מומלץ לעיין ברשימה של קבועים להצגה כדי לקבל רשימה מקיפה של הדגלים הזמינים.

קבלת נתוני ירידה

צריך להקצות את המגביל dragAndDropTarget לתוכן קומפוזבילי כדי לאפשר לתוכן הקומפוזבילי לקבל אירועי גרירה ושחרור. להתאמה יש שני פרמטרים: הראשון משמש כמסנן ומציין את סוג הנתונים שהוא יכול לקבל, והשני מספק את הנתונים בקריאה חוזרת (callback).

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

val callback = remember {
    object : DragAndDropTarget {
        override fun onDrop(event: DragAndDropEvent): Boolean {
            // Parse received data
            return true
        }
    }
}

קטע הקוד הבא מדגים איך לטפל בטקסט פשוט שנשמט:

Modifier.dragAndDropTarget(
    shouldStartDragAndDrop = { event ->
        event.mimeTypes().contains(ClipDescription.MIMETYPE_TEXT_PLAIN)
    }, target = callback
)

פונקציית הקריאה החוזרת צריכה להחזיר את הערך true אם האירוע צורך, או false אם האירוע נדחה ולא מופץ לרכיב ההורה.

איך מטפלים באירועי גרירה ושחרור

כדי לשלוט בצורה מדויקת בממשק המשתמש ובהתנהגות של האפליקציה, אפשר לבטל קריאות חוזרות (callback) בממשק של DragAndDropTarget כדי לראות מתי אירוע גרירה ושחרור מתחיל, מסתיים או נכנס לרכיב או יוצא ממנו:

object : DragAndDropTarget {
    override fun onStarted(event: DragAndDropEvent) {
        // When the drag event starts
    }

    override fun onEntered(event: DragAndDropEvent) {
        // When the dragged object enters the target surface
    }

    override fun onEnded(event: DragAndDropEvent) {
        // When the drag event stops
    }

    override fun onExited(event: DragAndDropEvent) {
        // When the dragged object exits the target surface
    }

    override fun onDrop(event: DragAndDropEvent): Boolean = true
}

מקורות מידע נוספים

Codelab: גרירה ושחרור ב-Compose