Android startDragAndDrop忽略被拖动视图是否更改其位置-如何更改在执行拖放操作后应返回的位置';你没处理好吗?
我为一个简单的拖放功能实现了一个Android startDragAndDrop忽略被拖动视图是否更改其位置-如何更改在执行拖放操作后应返回的位置';你没处理好吗?,android,drag-and-drop,Android,Drag And Drop,我为一个简单的拖放功能实现了一个View.OnDragListener,并增加了对拖动目标时滚动父视图的额外支持。如果我在有效的目标视图中释放拖动,则此操作正常(即,如果onDragEvent返回false用于DragEvent.ACTION\u DROP)。例如,在这里我开始拖动文件夹L,向上滚动并将其放到文件夹A中,动画工作正常: 如果我在拖动时不滚动,并且没有任何东西可以处理拖放操作,这也可以正常工作(即,如果onDragEvent为drageEvent.ACTION\u drop返回
View.OnDragListener
,并增加了对拖动目标时滚动父视图的额外支持。如果我在有效的目标视图中释放拖动,则此操作正常(即,如果onDragEvent
返回false
用于DragEvent.ACTION\u DROP
)。例如,在这里我开始拖动文件夹L,向上滚动并将其放到文件夹A中,动画工作正常:
如果我在拖动时不滚动,并且没有任何东西可以处理拖放操作,这也可以正常工作(即,如果
onDragEvent
为drageEvent.ACTION\u drop
返回true
,并且自开始拖动后,拖动视图的位置没有改变)。例如,这里我开始拖动文件夹L,将其拖动到不是有效放置目标的空白处,然后释放。动画将其向下移动到L的原始位置,看起来很好
但是,只要我在拖动时滚动父视图,并且没有任何东西可以处理拖放,动画就会变得完全错误,因为Android显然忽略了视图现在位于与以前不同的坐标的事实。它只是在调用
startdragandrop
时设置坐标,从不更新坐标。例如,这里我开始拖动文件夹L,向上滚动,将其拖动到不是有效放置目标的空白处,然后释放动画将其向上移动,因为这是L的原始位置相对于屏幕的位置,而不是滚动内容的位置:
我需要的是我向下移动到最后的位置,而不是开始的位置。如何实现这一点?我知道最终坐标,但不知道如何相应地修复动画。我甚至还没有找到任何安卓SDK代码来处理这个发布动画(谷歌似乎通过SurfaceSession
和系统私有IWindowSession.aidl
神奇地处理了这个问题)
我用于拖放的代码非常简单,如下所示:
val shadow = View.DragShadowBuilder(v)
@Suppress("DEPRECATION")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
v.startDrag(null, shadow, item, 0)
else
v.startDragAndDrop(null, shadow, item, 0)
val shadow=View.DragShadowBuilder(v)
@压制(“反对”)
if(Build.VERSION.SDK_INT
使其支持滚动的代码有点复杂,类似于此问题的解决方案:。
但这一部分并不是复制它的必要条件。您基本上只需要一个滚动视图
或回收视图
,并在开始拖动后以编程方式或手动方式滚动它。没什么特别的
请注意,我展示的示例可能会导致假设ItemTouchHelper可以解决我的问题。在正常情况下,ItemTouchHelper将是解决方案,但事实上,我实际上使用拖放在RecyclerViews之间(以及在片段之间)移动视图,这是ItemTouchHelper不支持的,因此在这种情况下不适用