【问题标题】:get dragged shadow location on View.OnDragListener在 View.OnDragListener 上获取拖动的阴影位置
【发布时间】:2016-01-13 07:15:10
【问题描述】:

我在我的应用程序中使用拖放功能。它工作正常。现在,如果视图未放置在放置的视图上,当视图返回到其原始位置时,我在为视图设置动画时遇到问题。

我通过

创建了我的阴影视图
  View.DragShadowBuilder shadowBuilder = new MyDragShadowBuilder(view);
                                view.startDrag(data, shadowBuilder, view, 0);

我的 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);
    }
}

现在,当我发现不成功的放置时,我希望我的视图具有动画效果并返回到原来的位置。

   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;

我能够在location 数组中获得我的视图的原始位置,即我的结束位置。我想要我在屏幕上拖动的视图(阴影视图)位置。但在任何情况下我都无法得到它。已尝试在DragEvent.ACTION_DRAG_LOCATION: 案例中获取它,但没有运气。它总是返回原始视图位置或放置视图位置的位置。我想要拖动阴影图像的位置。我想在两个位置之间的窗口中应用翻译动画。当我尝试使用 2 个静态位置时,窗口中 2 个位置之间的动画视图效果很好。

【问题讨论】:

    标签: android drag-and-drop


    【解决方案1】:

    要将您的阴影动画化到初始视图,您可以使用这个 sn-p。

    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);
    }
    

    在我的例子中,我从 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;
    

    当创建阴影时,你应该隐藏原始视图。

    View.DragShadowBuilder shadowBuilder = new MyDragShadowBuilder(view);
    view.startDrag(data, shadowBuilder, view, 0);
    view.setVisibility(View.INVISIBLE);
    

    这个问题很老,但我回答是因为可以帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多