【问题标题】:How to move an object on a SurfaceView without touching the object itself?如何在 SurfaceView 上移动对象而不接触对象本身?
【发布时间】:2018-04-24 21:16:30
【问题描述】:

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

我在黑色画布上有一个简单的白色矩形,并设置了 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;
}

我这样做的理由是,无需手指悬停即可看到该对象。这可能吗?

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

【问题讨论】:

    标签: android surfaceview touch-event


    【解决方案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);
    }
    

    【讨论】:

    • 我正在研究这个,但你打败了我。这是一种工作。我的矩形只从左上角到右下角对角线。哈哈。但这是进步!
    • 好的,我做了一点修改。在 offsetX 和 offsetY 声明中,我做了 myPoint.x 和 myPoint.y。有用。我很乐意接受你的回答。
    • @IRGeekSauce 好的,很高兴它按预期工作(您可以随时使用更新的解决方案编辑答案,以完成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2015-07-31
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多