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

时间:2017-11-11 21:52:59

标签: android surfaceview ontouchevent

我发现了this问题,但这是针对iOS开发的。我在Android上做的事情,所以没有任何帮助。

我在黑色画布上有一个简单的白色矩形,我设置了一个onTouchEvent。我可以按预期移动矩形,但这不是我正在寻找的功能。

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

现在,我有:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.channel.MessageChannels;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
public class SimplifiedIntegrationTest {
    @Test
    public void simpleTest() {
        MessageChannel inputChannel = MessageChannels.direct().get();
        QueueChannel outputChannel = MessageChannels.queue().get();
        IntegrationFlows.from(inputChannel).channel(outputChannel).get();

        inputChannel.send(MessageBuilder.withPayload("payload").build());

        Message<?> outMessage = outputChannel.receive(0);
        Assert.notNull(outMessage);
    }
}

我的理由是这样的物体可以在没有手指悬停在它上面的情况下看到。这可能吗?

以下是我想要实现的目标:

onTouch example

1 个答案:

答案 0 :(得分:1)

为什么不在onTouchEvent回调中获取并存储之前的MotionEvent坐标,然后当onTouchEvent再次触发时(ACTION_DOWN之后的第一个ACTION_MOVE,然后为每个ACTION_MOVE回调再触发)计算出值之间的偏移/差异然后得到你自己的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);
}