如何在保留原始android视图的同时进行拖放?

如何在保留原始android视图的同时进行拖放?,android,android-layout,drag-and-drop,android-view,Android,Android Layout,Drag And Drop,Android View,我正在开发一款Android游戏 我想知道拖放是否是解决这个问题的错误方法。我要寻找的效果是有一个按钮,当用户长按时,将启动拖放效果,拖放阴影是一个目标 此自定义拖曳阴影将持续存在,直到用户释放目标阴影。我有自定义阴影工作,并对拖动事件作出响应。我不确定的是如何在不移动启动拖动的按钮的情况下使整个过程正常工作 它是否简单到不将原始视图(按钮)传递给阴影生成器 编辑 添加了用于启动拖动的触摸侦听器的定义 private final class MyTouchListener implements

我正在开发一款Android游戏

我想知道拖放是否是解决这个问题的错误方法。我要寻找的效果是有一个按钮,当用户长按时,将启动拖放效果,拖放阴影是一个目标

此自定义拖曳阴影将持续存在,直到用户释放目标阴影。我有自定义阴影工作,并对拖动事件作出响应。我不确定的是如何在不移动启动拖动的按钮的情况下使整个过程正常工作

它是否简单到不将原始视图(按钮)传递给阴影生成器

编辑


添加了用于启动拖动的触摸侦听器的定义

private final class MyTouchListener implements OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
      if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        ClipData data = ClipData.newPlainText("", "");
        //DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, new TargetDragShadowBuilder(view), view, 0);
        view.setVisibility(View.INVISIBLE);
        return true;
      } else {
        return false;
      }
    }
  }
我在这里设置可见性,但老实说,我在这里尝试遵循教程:

也许这是错误的做法。我基本上希望执行以下步骤:

1) 检测以按钮开始的拖动事件

2) 在不以任何方式更改按钮的情况下,我希望在用户拖动屏幕时,我指定的图片(带有透明度)的自定义阴影显示在用户的手指下

最终,我需要弄清楚如何使阴影闪烁,或在消失前停留几秒钟,并获得用户释放手指的位置。从文档中可以看到,我可以通过操作拖动位置…?

以下是我的建议:

1)当用户长按按钮时,获取按钮的绝对坐标

 int coord[] = new int[2];
 button.getLocationOnScreen(coord);
2)创建“阴影视图”,用户拖动时需要在手指下方显示(如您所愿)

3)将阴影视图附加到
窗口
(其他布局保持不变):

4)使用用户拖动位置更新
params

params.x = // drag X - halfsize of the view's width
params.y = // drag Y - halfsize of the view's height
windowManager.updateViewLayout(shadowView, params);
5)当用户停止拖动时,从
窗口中删除阴影视图

windowManager.removeViewImmediate(shadowView);
关于如何在安卓系统中实现拖放功能,有一位官员表示同意。不幸的是,bonnyz提出的解决方案不符合此准则-添加临时视图以指示拖动操作在某种程度上是一个沉重的解决方案

回答你的问题:

它是否简单到不将原始视图(按钮)传递给阴影生成器

文件说:

View.DragShadowBuilder(视图)

此构造函数接受应用程序的任何视图对象。构造函数将视图对象存储在View.DragShadowBuilder对象中,因此在回调过程中,您可以在构建拖曳阴影时访问它。它不必与用户选择启动拖动操作的视图(如果有)关联

因此,您经过的视图不用于表示阴影。阴影是在
onDrawShadow()方法实现中的
Canvas
上绘制的


基本上,阴影只是一个图形,当被丢弃时跟随手指。它不是视图,也不必看起来像活动中的任何视图。是任意图形向用户提供了拖放内容的想法。

问题是我设置了视图不可见(facepalm)以响应触摸监听器。此外,我的影子将视图传递给super(),使视图随车而来。综合效果是视图被拖走并永远丢失。通过在customer dropshadowbuilder中删除可见性调用和从超类中删除视图修复

“目标”是什么?你想移动谁的影子?我真的不明白这个问题。。。在Android中,拖动操作仅“移动”由
DragShadowBuilder构建的阴影,原始视图不会改变(除非您明确地这样做)。到底是什么问题?如果需要,您可以通过使用
DragShadowBuilder
的自定义实现来提供完全不同的阴影。请让我理解:您想拖动一个有阴影的按钮,当您离开它时,按钮会回到其初始位置吗?在它被释放的那一点你怎么做?我有一个按钮。我希望允许用户将手指从该按钮拖动到视图上的其他位置。现在,按钮正在用他们的手指移动。我的自定义阴影是一个大的红色圆圈。一旦用户松开手指,圆圈和按钮就消失了。我想要的行为是,按钮完全不受影响,当用户拖动手指时,红色圆圈出现,当用户松开时,红色圆圈消失。谢谢。我会尝试一下,让你知道它是怎么回事。如果它看起来有意义/有效,我将接受并关闭。从调查来看,这似乎是一种相当严厉的方法,用于创建和销毁不符合Android拖放规范的视图。我不确定这是因为我的问题导致了一个非典型场景,还是因为疏忽。谢谢你的回复,我当然不会投反对票,但我也不能奖励赏金。再次感谢。对,但我的问题是视图(原始按钮)在被拖动时实际上正在消失。我试图在不影响原始视图(按钮)的情况下创建自定义阴影。我开始怀疑答案是否是不让按钮具有拖放侦听器,但仍然支持拖放阴影效果。这似乎不是一个罕见的场景被拖动的按钮不应该注册为
setOnDragListener()
。仅为视图设置拖动侦听器以接收拖放。然而,在我的实验中,我无法再现你的问题——可拖动的视图永远不会消失。你改变它的v吗
windowManager.removeViewImmediate(shadowView);