拖放 是最基本的手勢操作,使用者可以點選並按住圖片、文字或其他資料元素,然後將其拖動至另一個應用 (或者同一個應用的其他位置) 並鬆手,即可將資料放置到新的位置上。手勢通常在觸控式螢幕上表現為長按,在使用滑鼠時則為點選並拖動。
△ 簡單的拖放示例
雖然 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
中拖動文字,但我們強烈建議支援使用者從應用的其他元件中拖動任何圖片、檔案和文字。同樣重要的是,我們也鼓勵支援使用者將資料拖放至您的應用。
△ 從一個應用中拖動到另一個應用
DropHelper 和 DragStartHelper 結合使用,可以更輕鬆地處理手勢支援、回撥、樣式和畫素完美對齊。
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 版本並期待您的 反饋。
歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!