共计 1947 个字符,预计需要花费 5 分钟才能阅读完成。
拖放 是最根本的手势操作,用户能够点击并按住图片、文本或其余数据元素,而后将其拖动至另一个利用 (或者同一个利用的其余地位) 并松手,即可将数据搁置到新的地位上。手势通常在触摸屏上体现为长按,在应用鼠标时则为点击并拖动。
△ 简略的拖放示例
尽管 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 版本并期待您的 反馈。
欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!