2015-01-17 52 views
1

我有一个自定义相对布局,我可以拖放一些 按钮。我开始拖动我的onTouch:删除或取消DragShadow

/** 
* 
*/ 
@Override 
public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN : { 
      ClipData data = ClipData.newPlainText("", ""); 
      ImageButton imageButton = (ImageButton)view; 
      View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(imageButton); 

      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
     } break; 
     case MotionEvent.ACTION_UP: { 
      view.performClick(); 
      view.setVisibility(View.VISIBLE); 
     } break; 
    } 

    return true; 
} 

正如你所看到的我创建一个DragShadow。我现在有一个小问题,因为我定义了一个拖拽区域。当用户拖动按钮进行拖动区域的拖动被取消:

/** 
    * 
    */ 
    @Override 
    public boolean onDrag(View view, DragEvent event) { 
     View sourceView = (View) event.getLocalState(); 

     float sourceX = sourceView.getX(); 
     float sourceY = sourceView.getY(); 
     float dropX = event.getX() - (sourceView.getWidth()/2); 
     float dropY = event.getY() - (sourceView.getHeight()/2); 

     switch(event.getAction()) { 
      case DragEvent.ACTION_DRAG_EXITED : { 
       TranslateAnimation animation = new TranslateAnimation(dropX - sourceX, 0, dropY - sourceY, 0); 
       animation.setDuration(300); 

       sourceView.startAnimation(animation); 
       sourceView.setX(sourceX); 
       sourceView.setY(sourceY); 
       sourceView.setVisibility(View.VISIBLE); 
      } break; 
      case DragEvent.ACTION_DROP : { 
       sourceView.setX(dropX); 
       sourceView.setY(dropY); 
       sourceView.setVisibility(View.VISIBLE); 

       TranslateAnimation animation = new TranslateAnimation(dropX - sourceX, 0, dropY - sourceY, 0); 
       animation.setDuration(300); 

       sourceView.startAnimation(animation); 
       sourceView.setX(sourceX); 
       sourceView.setY(sourceY); 
      } break; 
     } 

     return true; 
    } 
} 

因此,当用户离开该阻力区域的按钮被使用动画自动移回原来的位置。问题是DragShadow仍然可见,我找不到方法来删除或取消DragShadow。只要用户触摸屏幕,DragShadow就可见。

那么,如何在ACTION_DRAG_EXITED被触发时以编程方式取消或删除DragShadow?

回答

1

没有办法做到这一点。 Android拖影的可悲事实是它一旦创建就无法更改。 (我试图创建一个视觉上可以响应其他视图的拖动阴影时遇到了这个问题)。你有两个选择:

1:最简单的解决方案是不尝试取消ACTION_DRAG_EXITED上的拖动。它违背了Android的设计模式,似乎这样做可能会让用户恼火。除非你有充分的理由需要这个功能,否则我会说离开它。

编辑:我以前说过,你可以检查看是否在视图中的放置点。有一个更简单的方法来实现这一点:

当用户放弃阴影时,无论是否处于正在监听拖动事件的视图中,都会发送ACTION_DRAG_ENDED。如果ACTION_DROP在侦听视图中释放,它也会被发送。

所以你想要做的只是让代码将按钮移动到ACTION_DROP上的新位置,并让动画在ACTION_DRAG_ENDED上运行。无论按钮是否移动到新位置,动画都会运行。

2:滚动您自己的拖放代码。这并不难,有很多教程,并且如果你愿意去掉兔子洞,它会打开一个可能的世界(例如多指拖放)。我发现它是一个很好的学习体验。