Bee*_*ena 1 android drag-and-drop
我在应用程序中使用拖放功能。工作正常。现在,当视图未放置在放下的视图上时,如果视图返回其原始位置,则在给视图设置动画时会遇到问题。
我通过创建了阴影视图
View.DragShadowBuilder shadowBuilder = new MyDragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
Run Code Online (Sandbox Code Playgroud)
我的shadowbuilder类是
private static class MyDragShadowBuilder extends View.DragShadowBuilder {
private static Drawable shadow;
public MyDragShadowBuilder(View v) {
// Stores the View parameter passed to myDragShadowBuilder.
super(v);
v.buildDrawingCache();
shadow = new BitmapDrawable(v.getDrawingCache());
}
@Override
public void onProvideShadowMetrics (Point size, Point touch){
// Defines local variables
int width, height;
width = (int)(getView().getWidth() * 1.1);
height =(int)(getView().getHeight() * 1.1);
shadow.setBounds(0, 0, width, height);
size.set(width, height);
touch.set(width / 2, height / 2);
}
@Override
public void onDrawShadow(Canvas canvas) {
// Draws the ColorDrawable in the Canvas passed in from the system.
shadow.draw(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我发现放下失败时,我希望我的视图变得生动起来并返回到其原始位置。
case DragEvent.ACTION_DRAG_ENDED:
if (!event.getResult()) {
if (dragged.getTag() == v.getTag()){
int[] location={0,0};
v.getLocationOnScreen(location);
Log.v("values::", "x:" + x + " - y:" +x);
addViewRemoveViewFromWindow(dragged, location);
}
}
break;
Run Code Online (Sandbox Code Playgroud)
我能够在location
数组中获得视图的原始位置,即结束位置。我想要我在屏幕上拖动的视图(阴影视图)位置。但无论如何我都无法得到它。试图解决这个问题,DragEvent.ACTION_DRAG_LOCATION:
但是没有运气。它总是返回原始视图位置或放下视图位置的位置。我想要拖动阴影图像的位置。我想在两个位置之间的窗口中应用翻译动画。当我尝试使用2个静态位置时,在2个位置之间的窗口中的动画视图效果很好。
要将阴影动画化为初始视图,可以使用此片段。
private void animateDragToStart(View initialView, float fromX, float fromY) {
float topMargin = fromY - initialView.getTop();
float leftMargin = fromX - initialView.getLeft();
Animation translateAnimation = new TranslateAnimation(leftMargin - (initialView.getWidth() / 2), 0, topMargin - (initialView.getHeight() / 2), 0);
translateAnimation.setDuration(500);
translateAnimation.setInterpolator(new AccelerateInterpolator());
initialView.startAnimation(translateAnimation);
initialView.setVisibility(View.VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我从DROP案例中调用了方法。
case DragEvent.ACTION_DROP:
View initialView = (View) event.getLocalState();//get your initial view
initialView.setVisibility(View.VISIBLE);
animateDragToStart(initialView, event.getX(), event.getY());
// Returns true. DragEvent.getResult() will return true.
return true;
Run Code Online (Sandbox Code Playgroud)
创建阴影后,您应该隐藏原始视图。
View.DragShadowBuilder shadowBuilder = new MyDragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
Run Code Online (Sandbox Code Playgroud)
这个问题很老,但是我回答了,因为可以帮助别人。
归档时间: |
|
查看次数: |
1293 次 |
最近记录: |