对讲时如何聚焦拖动阴影视图?

问题描述 投票:0回答:1

我使用自定义的 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 drag-and-drop talkback
1个回答
0
投票

[补充说明]

我注意到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

如果拖动阴影是由应用程序级别创建的,则很难拖动到其他应用程序窗口中,因此我认为由系统级别创建拖动阴影更合理。

不幸的是,以下是我的调查结论: 可能无法将对讲焦点事件发送到应用程序级别的系统级创建的视图。

希望可以帮助到更多的开发者。如果您有更好的建议,请留言讨论。

© www.soinside.com 2019 - 2024. All rights reserved.