Jetpack DragAndDrop 庫——拖放操作如此輕鬆!

Android開發者發表於2022-02-07

拖放 是最基本的手勢操作,使用者可以點選並按住圖片、文字或其他資料元素,然後將其拖動至另一個應用 (或者同一個應用的其他位置) 並鬆手,即可將資料放置到新的位置上。手勢通常在觸控式螢幕上表現為長按,在使用滑鼠時則為點選並拖動。

△ 簡單的拖放示例

△ 簡單的拖放示例

雖然 Android 很早以前便一直支援拖放操作 (DragEvent 在 Android 3.0 即 API 級別為 11 中引入),但事實證明實現對處理手勢、事件、許可權和回撥的全面支援並不容易。

我們將為您介紹目前處於 Alpha 階段的 Jetpack DragAndDrop 庫,幫助您更輕鬆地在應用中處理拖放資料。

/* Copyright 2021 Google LLC.SPDX-License-Identifier: Apache-2.0 */
implementation 'androidx.draganddrop:draganddrop:1.0.0-alpha02'

拖放操作在大螢幕裝置中變得越來越重要: 平板電腦和膝上型電腦,尤其是可摺疊裝置,其分屏模式的拖放操作使用概率是傳統手機的 7 倍。對使用者而言,將資料從一個應用拖動到另一個應用是很自然的體驗,因此使用者在 分屏或視窗模式 下使用應用可以更有效地進行多工處理。

雖然平臺本身支援從 EditText 中拖動文字,但我們強烈建議支援使用者從應用的其他元件中拖動任何圖片、檔案和文字。同樣重要的是,我們也鼓勵支援使用者將資料拖放至您的應用。

△ 從一個應用中拖動到另一個應用

△ 從一個應用中拖動到另一個應用

DropHelperDragStartHelper 結合使用,可以更輕鬆地處理手勢支援、回撥、樣式和畫素完美對齊。

DragStartHelper

DragStartHelper 是 Jetpack 核心庫中的工具類,通常用於檢測開始拖動的手勢,例如長按或滑鼠的點選拖動操作。

/* Copyright 2021 Google LLC.SPDX-License-Identifier: Apache-2.0 */

// 將檢視設定為可拖動以共享檔案。
// DragStartHelper 負責攔截拖動手勢並設定監聽器。

DragStartHelper(draggableView) { view, _ ->
   
// 自動設定合適的 MIME 型別

    val dragClipData = ClipData.newUri(contentResolver, "File", fileUri)

    // 設定被拖動物件的視覺效果
    // 可以擴充套件和自定義,我們這裡使用預設效果

    val dragShadow = View.DragShadowBuilder(view)

    // 開始拖動。注意可以使用全域性標記實現跨應用拖動。

    view.startDragAndDrop(
        dragClipData,
        dragShadow,
        null, // 額外的本地狀態資訊,可選項
        // 由於這是一個 "content:" URI 而不僅僅是純文字,我們可以使用
        // DRAG_FLAG_GLOBAL_URI_READ 標記使得其他應用可以從我們的 ContentProvider
        // 中讀取資訊。如果不使用該標記,其他應用不會收到拖動事件。

        DRAG_FLAG_GLOBAL or DRAG_FLAG_GLOBAL_URI_READ)
    )
}.attach()

DropHelper

新的 DropHelper 是一個負責監聽器和放置目標的工具類。務必使用 addInnerEditTexts() 構建 DropHelper.Options,以此確保您放置目標內任何巢狀的 EditTexts 都不會獲得焦點。

/* Copyright 2021 Google LLC.SPDX-License-Identifier: Apache-2.0 */

DropHelper.configureView(
 
   // 處理該放置事件的 Activity

    this,
 
   // 目標放置檢視會被高亮

    outerDropTarget,

    // 支援的 MIME 型別

    arrayOf(MIMETYPE_TEXT_PLAIN, "image/*"),

    // 配置放置目標的選項

    DropHelper.Options.Builder()

        // 要確保正確高亮放置目標,所有放置目標檢視層級內的 EditText 元素
        // 必須通過該方法新增到呼叫中。否則目標檢視內的 EditText 而不是目標檢視
        // 將在拖放操作中獲得焦點。

        .addInnerEditTexts(innerEditText)
        .build()
) { _, payload ->

  // 在這裡處理資料,返回需要委託給平臺的任何內容

  ...
}

瞭解更多

更多詳情請參閱給 Android 開發者的 拖放指南,通過 大螢幕示例 更深入瞭解 DropHelper 實踐。歡迎立即嘗試 Alpha 版本並期待您的 反饋

歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!

相關文章