【问题标题】:Showing drop targets when drag starts拖动开始时显示放置目标
【发布时间】:2017-04-26 11:36:49
【问题描述】:

我正在尝试在用户开始拖动时立即使放置目标可见(或添加它们)。

文档解释说,当收到ACTION_DRAG_STARTED 时,这应该在onDrag 中处理,然后可以用来表示将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 并在拖动开始/结束时进行一些动态调整?看起来真的很傻……

有更好的建议吗?

【问题讨论】:

标签: java android drag-and-drop


【解决方案1】:

您需要在调用startDrag()startDragAndDrop() 之前更改可见性。我在this sample app 中证明了这一点(来自this bookthis chapter,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() 基本上捕获了可见放置目标的名单,因此在此之后对该名单的更改(新小部件、新可见小部件)没有任何影响。

【讨论】:

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