Android-修改拖动阴影而不更改拖动开始视图

时间:2017-08-10 09:41:33

标签: android drag-and-drop

我想创建一个与被拖动视图不同的自定义拖动阴影(实际上它是被拖动视图的修改版本)。

我可以将视图传递给View.DragShadowBuilder构造函数,如下所示:

View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(myView);

问题是我对myView所做的任何更改也会影响被拖动的视图(这是因为无法克隆视图)。 How do I clone a View?

或者,我可以扩展View.DragShadowBuilder并使用提供的onDraw(Canvas canvas)方法中的位图绘制我的自定义视图。但是我首先在制作阴影方面遇到了麻烦(我假设这是一种有效的方法)。

相反,是否可以从附加到屏幕的视图中制作自定义拖动阴影?任何指针或解决方案都是最有帮助的。

到目前为止,我的搜索没有产生任何有用的结果: How to create a custom drag shadow? How to show custom DragShadow instead of ListViewFragment row?

2 个答案:

答案 0 :(得分:1)

回答自己的问题。传递给View.DragShadowBuilder(View view)的参数需要是可见的(并附加到合适的布局容器)。来自xml的膨胀视图或未附加到任何ViewGroup / View的动态创建视图不会生成任何拖动阴影。

这里的关键是扩展View.DragShadowBuilder类并覆盖onDrawShadow(Canvas canvas)方法

@Override
onDrawShadow(Canvas canvas) {
    final View view = mView.get();

    /* give drag shadow a blue background, this also changes the drag-start view
    attached to the screen */
    view.setBackgroundColor(Color.BLUE);

    view.draw(canvas);

    /* bring the drag-start view back to its original state (does not affect drag-shadow) */
    view.setBackgroundColor(Color.TRANSPARENT);
} 

如果您要求更改拖动阴影以使其与附加到屏幕的drag-start视图不同,请在调用view.draw(canvas)之前修改视图并将其恢复到原始状态在view.draw(canvas)方法之后。

这可以完成工作,但是作为一个黑客来到。总结一下这里的关键是在draw(canvas)方法之前操作视图,并在相同方法之后将其重置为其原始状态。希望这很有用。

答案 1 :(得分:-2)

View.updateDragShadow为此公开,SDK版本> = 24。 我猜您的解决方案更好,因为它更灵活。