Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android startDragAndDrop忽略被拖动视图是否更改其位置-如何更改在执行拖放操作后应返回的位置';你没处理好吗?_Android_Drag And Drop - Fatal编程技术网

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不支持的,因此在这种情况下不适用