הכלי '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