如何在不接触对象本身的情况下在 SurfaceView 上移动对象?

How to move an object on a SurfaceView without touching the object itself?

我找到了 this 问题,但它是针对 iOS 开发的。我正在 Android 做一些事情,所以没有任何帮助。

我在黑色背景上有一个简单的白色矩形 canvas,并且设置了一个 onTouchEvent。我可以按预期移动矩形,但这不是我要寻找的功能。

我需要知道如何触摸屏幕上的任意位置并移动对象?我不希望对象的 X 和 Y 成为我的触摸事件的 getX() 和 getY()。

目前,我有:

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            myPoint.set((int)event.getX(), (int)event.getY());
    }
    return true;
}

我这样做的原因是,无需将手指悬停在物体上即可看到该物体。这可能吗?

这是我想要实现的目标的直观表示:

为什么不在 onTouchEvent 回调中获取并存储之前的 MotionEvent 坐标,然后在 onTouchEvent 再次触发时(第一个 ACTION_MOVE 在 ACTION_DOWN 之后,然后每个 ACTION_MOVE 回调依此类推)计算出值之间的 offset/difference 然后获取您自己的 myPoint 坐标并将偏移量添加到它们的当前值。这样,您只是将 myPoint 对象移动了位置偏移量,而不是实际坐标。

此代码未经测试,我也没有使用 IDE 但类似这样的代码:

private float oldX;
private float oldY;

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            oldX = event.getX();
            oldY = event.getY();
            break;

        case MotionEvent.ACTION_MOVE:
            float newX = event.getX();
            float newY = event.getY();
            float offsetX = getOffset(oldX, newX, myPoint.x);
            float offsetY = getOffset(oldY, newY, myPoint.y);

            myPoint.set((int) offsetX, (int) offsetY);

            oldX = newX;
            oldY = newY;
            break;
    }
    return true;
}

private float getOffset(float oldVal, float newVal, float current) {
    return current + (newVal - oldVal);
}