Android-在不更改拖动开始视图的情况下修改拖动阴影

问题描述:

我想创建一个与被拖动的视图不同的自定义拖动阴影(实际上它是被拖动的视图的修改版本)。Android-在不更改拖动开始视图的情况下修改拖动阴影

我可以通过一个着眼于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?

回答自己的问题。传递给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)方法后将其恢复到原始状态。

这样做可以完成工作,但会成为黑客攻击。总结这里的关键是在方法之前操纵视图,并在相同的方法之后将其重置为其原始状态。希望这是有用的。