△ 简单的拖放示例
DragEvent
https://developer.android.google.cn/reference/android/view/DragEvent
/* Copyright 2021 Google LLC.SPDX-License-Identifier: Apache-2.0 */implementation 'androidx.draganddrop:draganddrop:1.0.0-alpha02'
拖放操作在大屏幕设备中变得越来越重要: 平板电脑和笔记本电脑,尤其是可折叠设备,其分屏模式的拖放操作使用概率是传统手机的 7 倍。对用户而言,将数据从一个应用拖动到另一个应用是很自然的体验,因此用户在分屏或窗口模式下使用应用可以更有效地进行多任务处理。
DropHelper 和 DragStartHelper 结合使用,可以更轻松地处理手势支持、回调、样式和像素完美对齐。
DropHelper
https://developer.android.google.cn/reference/androidx/draganddrop/DropHelper
DragStartHelper
https://developer.android.google.cn/reference/androidx/core/view/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
/* Copyright 2021 Google LLC.SPDX-License-Identifier: Apache-2.0 */DropHelper.configureView(// 处理该放置事件的 Activitythis,// 目标放置视图会被高亮outerDropTarget,// 支持的 MIME 类型arrayOf(MIMETYPE_TEXT_PLAIN, "image/*"),// 配置放置目标的选项DropHelper.Options.Builder()// 要确保正确高亮放置目标,所有放置目标视图层级内的 EditText 元素// 必须通过该方法添加到调用中。否则目标视图内的 EditText 而不是目标视图// 将在拖放操作中获得焦点。.addInnerEditTexts(innerEditText).build()) { _, payload ->// 在这里处理数据,返回需要委托给平台的任何内容...}
了解更多
更多详情请参阅给 Android 开发者的拖放指南,通过大屏幕示例更深入了解 DropHelper 实践。欢迎立即尝试 Alpha 版本并期待您的反馈。
拖放指南
https://developer.android.google.cn/guide/topics/ui/drag-drop
大屏幕示例
https://github.com/android/user-interface-samples/pull/302/
反馈
https://issuetracker.google.com/issues/new?component=1139019
推荐阅读