在Android中拖动精灵

时间:2015-02-21 21:03:20

标签: android scroll ontouchevent touchscreen

我只是想用手指拖动精灵。我这样做是通过检测触摸屏幕的手指移动的距离,然后将精灵移动相同的量。

这是一个openGL ES 2.0应用程序,所以我的渲染和逻辑更新发生在我的GL渲染线程上,显然在UI线程上捕获了触摸事件。

所以,我的设置是这样的:

用户界限线程

    case MotionEvent.ACTION_MOVE: {

            movedByX = event.getX()-oldXPosition;
            movedByY = event.getY()-oldYPosition;

            oldXPosition = event.getX();
            oldYPosition = event.getY();
            break;

    }

GL渲染线程

渲染

@Override
public void render() {

    drawSprite(testSprite);  //Draws using the sprites' internal x and y coordinates

}

逻辑更新

@Override
public void updateLogic() {

    testSprite.x+=movedByX;  //Update the sprite's X position
    testSprite.y+=movedByY;  //Update the sprite's Y position

}

问题

如果有人将精灵拖动屏幕一段时间,然后停止。手指相对于精灵的静止点与手指最初下降时的相同。举个例子,像一个圆圈精灵。 蓝色圆圈是精灵,红点代表手指/指针。

enter image description here

正如你所看到的,它并没有按预期工作,我不知道为什么。

我之前遇到过一个类似的问题,我通过最初在ACTION_MOVE(onTouchEvent / UI线程)中抓取X和Y来解决问题,就像我上面一样,但是在我的updateLogic方法中,我做了一个副本在将它应用到我的精灵位置之前,计算出'moveByY'的数量。

这样做有效地解决了手指'徘徊'的问题 - 但是 - 它使精灵的运动非常不稳定,因此我不能使用这个解决方案。

我认为这种不稳定可能是因为渲染线程有时会在没有UI线程运行的情况下运行两次,因此,即使手指已移动,逻辑仍然使用它具有的版本,因为onTouch无法捕获到实际上最新的手指位置。但我不是百分百肯定。

如果我只是在我的UI线程中更新我的精灵位置(再次,在ACTION_MOVE中) - 再次,我的动作非常不稳定,但指针位置确实保持正确。)

所以,我需要保持从问题顶部概述的方法得到的平滑运动,但我需要知道为什么moveBy量导致精灵从手指中移动。

其他笔记

我需要使用手指的旧位置和当前位置之间的差异来移动精灵,而不是简单地在手指的当前位置绘制精灵,因为这最终将成为“可滚动”菜单系统的一部分。

我的所有变量都被声明为'private float volatile',并且我的onTouchEvent和updateLogic方法是同步的。

1 个答案:

答案 0 :(得分:0)

我不知道它是否是一个错字

@Override
public void updateLogic() {
testSprite.x+=movedByX;  //Update the sprite's X position
testSprite.x+=movedByY;  //Update the sprite's Y position
}

但是你设置了testsprite.x两次