拖动开始时显示放下目标

时间:2017-04-26 11:36:49

标签: java android drag-and-drop

我试图在用户开始拖动时立即显示(或添加)目标。

该文档解释说,收到onDrag后,应在ACTION_DRAG_STARTED处理此问题,然后可以将其用于强调View能够接受拖动。

但是,我的视图(实际上是LinearLayout)在没有拖动时应该看起来不同,并且在启动拖动时显示放置目标。

正常看:

[Item A][Item B]

当拖动开始时,它应该如下所示:

[ ][Item A][ ][Item B][ ]

其中空括号表示可以删除拖动的位置。

我已尝试以下方法来实现这一目标:

1)动态添加视图

当顶级容器收到ACTION_DRAG_STARTED时,动态添加放置目标视图。问题:新添加的视图从不接收ACTION_DRAG_STARTED本身(或任何其他事件),因此他们无法接受丢弃。

2)隐藏掉落目标

始终在可用的实际项目之间放置View.GONE个放置目标,并在拖动开始时将它们设为View.VISIBLE

    if(event.getAction() == DragEvent.ACTION_DRAG_STARTED) {
      // Make all containers visible:
      for(int i = 0; i < cc.getChildCount(); i++) {
        cc.getChildAt(i).setVisibility(View.VISIBLE);
      }
    }

问题:显然View.GONE也意味着视图不会收到事件。与View.INVISIBLE相同。

那么,我的选择是什么?使用说View.VISIBLE并在拖动开始/结束时进行一些动态调整大小?看起来真傻......

有更好的建议吗?

1 个答案:

答案 0 :(得分:1)

您需要在致电startDrag()startDragAndDrop()之前更改可见性。我在this sample app(来自this chapter this book,FWIW)中证明了这一点。

在该示例中,如果您在平板电脑上运行它,我将通过长按RecyclerView中的项目来启动拖放操作:

  @Override
  public boolean onLongClick(View v) {
    if (listener!=null) {
      listener.onStartDrag();
    }

    ClipData clip=ClipData.newRawUri(title.getText(), videoUri);
    View.DragShadowBuilder shadow=new View.DragShadowBuilder(thumbnail);

    itemView.startDrag(clip, shadow, Boolean.TRUE, 0);

    return(true);
  }

但在我致电startDrag()之前,我让一位注册的听众知道我即将开始拖拽。该监听器是托管活动,它使我的“热点”放置目标可见:

  @Override
  public void onStartDrag() {
    info.setVisibility(View.VISIBLE);
  }

净效果类似于主屏幕,当您开始拖动时,会出现特定的“操作”(例如,卸载)。

我最初尝试了你的第二种方法,但它没有用。我的假设是调用startDrag()startDragAndDrop()基本上捕获了可见丢弃目标的名单,因此对该名单(新小部件,新显示的小部件)的更改在此之后无效。