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

时间:2014-12-09 23:09:54

标签: android android-layout drag-and-drop android-view

我正在开发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;
      }
    }
  }

我在这里设置可见性,但老实说我坦率地试着按照这里的教程:
http://www.vogella.com/tutorials/AndroidDragAndDrop/article.html

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

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

2)如果不以任何方式改变按钮,我想要一个我指定的图片(带透明度)的自定义阴影在用户的手指下方显示,因为它们在屏幕上拖动。

最终我需要弄清楚如何让阴影闪现,或者在消失前徘徊几秒钟,以及获取用户释放手指的位置。看起来我可以从ACTION_DRAG_LOCATION获取文档......?

3 个答案:

答案 0 :(得分:2)

有一个关于如何在Android中实现拖放的官方API Guide。不幸的是, bonnyz 提出的解决方案不符合本指南 - 添加临时视图以指示拖动操作在某种程度上是一个重量级的解决方案。

回答你的问题:

  

是不是简单地将原始视图(按钮)传递给阴影构建器?

文档说:

  

View.DragShadowBuilder(查看)

     

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

因此,您传递的视图不习惯表示阴影。阴影是您在Canvas方法实现中onDrawShadow()上绘制的阴影。

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

答案 1 :(得分:0)

这是我的建议:

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

 int coord[] = new int[2];
 button.getLocationOnScreen(coord);

2)创建" ShadowView "当用户拖动(如你所愿)时需要在手指下显示

3) ShadowView 附加到Window(其他布局保持不变):

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View shadowView = /..shadow view.../

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_PHONE,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT);

params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = coord[0]; //add offset if needed 
params.y = coord[1];

windowManager.addView(shadowView, params);

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)当用户停止拖动时,请从Window中删除 ShadowView

windowManager.removeViewImmediate(shadowView);

答案 2 :(得分:0)

问题是我正在设置视图不可见(facepalm)以响应触摸侦听器。此外,我的影子正在将视图传递给super(),使视图出现在骑行中。综合效果是视图的外观被拖走并永远丢失。通过删除可见性调用并从客户dropshadowbuilder中的超类中删除视图来修复。