我使用自定义的 DragShadowBuilder 进行拖放。对讲时长按项目后将创建拖动阴影。
1 秒后,我向拖影发送一个辅助功能事件。除了发送TYPE_VIEW_ACCESSIBILITY_FOCUSED之外,我还尝试了TYPE_VIEW_FOCUSED和TYPE_VIEW_HOVER_ENTER。
开始拖动后,我无法将对讲(绿框)聚焦在拖动阴影之上。
binding.item.setOnLongClickListener { view ->
val data = ClipData.newPlainText("", "")
val shadowBuilder = CustomDragShadowBuilder(view)
view?.startDragAndDrop(data, shadowBuilder, view, 0)
view.postDelayed({
shadowBuilder.view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED)
}, 1000)
false
}
CustomDragShadowBuilder如下。
class CustomDragShadowBuilder(view: View) : View.DragShadowBuilder(view) {
init {
view.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
view.contentDescription = "one two three"
}
override fun onDrawShadow(canvas: Canvas) {
canvas.drawColor(view.context.getColor(R.color.custom_drag_shadow_color))
view.draw(canvas)
}
override fun onProvideShadowMetrics(outShadowSize: Point, outShadowTouchPoint: Point) {
val width = view.width
val height = view.height
outShadowSize.set(width, height)
outShadowTouchPoint.set(width / 2, height / 2)
}
}
另外,我发现我在我的应用程序的组件树中找不到这个拖动阴影节点,而且它的生成似乎对我的应用程序没有任何影响。
我预计一旦开始拖动,对讲(绿框)将集中在拖动阴影上。
[补充说明]
我注意到Android文档中的一句话。我猜测拖动阴影是由系统级别创建的。
系统回调您的应用程序以获取拖动阴影。并在拖放过程中向用户显示。
https://developer.android.com/develop/ui/views/touch-and-input/drag-drop#AboutDragging
此外,拖放支持多个窗口。 https://developer.android.com/develop/ui/views/touch-and-input/drag-drop/multi-window
如果拖动阴影是由应用程序级别创建的,则很难拖动到其他应用程序窗口中,因此我认为由系统级别创建拖动阴影更合理。
不幸的是,以下是我的调查结论: 可能无法将对讲焦点事件发送到应用程序级别的系统级创建的视图。
希望可以帮助到更多的开发者。如果您有更好的建议,请留言讨论。