Java 如何拖放LibGDX图像参与者

Java 如何拖放LibGDX图像参与者,java,drag-and-drop,libgdx,Java,Drag And Drop,Libgdx,我有一个LibGDX场景和几个图像(Actor子类)。我想把一张图片拖到另一张上面。我从位于的源代码开始。因为我基本上希望源代码是有效负载,所以我尝试修改payload.setDragActor以使用源图像。这是一种工作方式,我需要添加代码以将负载参与者放回舞台,但这不是我的问题 我的问题是,负载(当它是源参与者或单独的参与者时)没有真正被拖动。相反,所发生的是负载参与者将自身稍微向下定位到鼠标光标的右侧。我想要放置有效载荷,而不是指向我想要放置有效载荷的位置。它一点也不想拖动,它感觉有东西在跟

我有一个LibGDX场景和几个图像(Actor子类)。我想把一张图片拖到另一张上面。我从位于的源代码开始。因为我基本上希望源代码是有效负载,所以我尝试修改
payload.setDragActor
以使用源图像。这是一种工作方式,我需要添加代码以将负载参与者放回舞台,但这不是我的问题


我的问题是,负载(当它是源参与者或单独的参与者时)没有真正被拖动。相反,所发生的是负载参与者将自身稍微向下定位到鼠标光标的右侧。我想要放置有效载荷,而不是指向我想要放置有效载荷的位置。它一点也不想拖动,它感觉有东西在跟着光标。我在Android emulator上看到的行为与我在桌面版应用程序上看到的行为相同。

您没有显示任何代码,因此很难知道您实际在做什么。根据您的描述,听起来您是在将有效负载放置在光标所在的位置,而不是在开始拖动后将其移动到与光标移动相同的偏移量

假设您使用的是ActorGestureListener,这就是我在应用程序中所做的

float touchX, touchY;

public void touchDown(InputEvent ev, float x, float y, int pointer, int button) {
    touchX = x;
    touchY = y;
    ...
}

public void pan(InputEvent ev, float x, float y, float dx, float dy) {
    moveBy(x - touchX, y - touchY);
    ...
}

通过这种方式,你移动你的演员的量与鼠标光标移动的量相同,所以它就像指针“粘”在你接触演员的地方一样。另外,我相信libgdx中的事件会使您在光标在actor内部移动一点之前不会收到pan事件,因此在测试时要注意这一点(仅移动光标几个像素不会触发pan事件).

我在LibGDX源代码中查找
com.badlogic.gdx.scenes.scene2d.utils.dragandrop
,找到了答案。代码将有效负载+14放置在光标的X方向上,将(-20-payLoadActor.getHeight())放置在Y方向上,这就是我无法直观地拖动有效负载的原因。有一种
setDragActorPosition
方法可用于纠正位置。如果始终希望拖动的有效负载位于光标下方的中心,可以执行以下操作:

final DragAndDrop dragAndDrop = new DragAndDrop();
dragAndDrop.setDragActorPosition(-(sourceImage.getWidth()/2), sourceImage.getHeight()/2);
如果希望拖动的有效负载保持其在光标/手指下的位置,则在
dragStart
方法中调用
setDragActorPosition
时必须使用光标位置

final DragAndDrop dragAndDrop = new DragAndDrop();
dragAndDrop.addSource(new DragAndDrop.Source(sourceImage) {
    public DragAndDrop.Payload dragStart (InputEvent event, float x, float y, int pointer) {
        DragAndDrop.Payload payload = new DragAndDrop.Payload();
        payload.setDragActor(sourceImage);
        dragAndDrop.setDragActorPosition(-x, -y + sourceImage.getHeight());
        return payload;
    }
    public void dragStop (InputEvent event, float x, float y, int pointer, Target target) {
        sourceImage.setBounds(50, 125, sourceImage.getWidth(), sourceImage.getHeight());
        if(target != null) {
            sourceImage.setPosition(target.getActor().getX(), target.getActor().getY());
        }
        virtualStage.addActor(sourceImage);
    }
});

正如我所说,我使用的代码是我没有放置任何东西,
com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop
应该根据我的理解为我处理这个问题,但位置是给演员的(有效载荷)当光标移动时,看起来很愚蠢,而且在视觉上与拖动不一致。我明白了为什么你错过了我链接到的源代码,我正在使用的源代码-有人编辑了我链接到类名的链接,使它很容易错过。我想有一点bug-减号在x参数上。它应该位于y参数上:“dragAndDrop.setDragActorPosition(sourceImage.getWidth()/2,-(sourceImage.getHeight()/2))”