2013-02-02 27 views
0

我正在创建一个简单的OpenGL“应用程序”来旋转三角形。我希望在第一次触摸时保存触摸位置对应的角度。然后,在运动时,将形状旋转对应于当前位置的角度减去第一次触摸的角度。ACTION_DOWN的行为像ACTION_MOVE

这是我的理解,第一步应该在MotionEvent.ACTION_DOWN,第二步在MotionEvent.ACTION_MOVE。但是,在运动过程中似乎正在调用ACTION_DOWN。也就是说,下面的代码将导致形状旋转的手指拖动(我理解,这只会旋转到初始触摸的位置):

private double mTheta;  

@Override 
public boolean onTouchEvent(MotionEvent e) { 

    super.onTouchEvent(e); 

    float x = e.getX(); 
    float y = e.getY(); 

    switch (e.getAction()) { 

    case MotionEvent.ACTION_DOWN: 
     x -= getWidth()/2; 
     y -= getHeight()/2; 
     mTheta = Math.atan2(-x,-y) * 180.0f/Math.PI; 
     GL20Renderer.mAngle = (float) mTheta; 
     requestRender(); 
    } 
    return true; 
} 

是我的代码错了,或者这模拟器的怪异行为? (我目前没有访问Android设备。)

(附录:我原来试图完全实现上述,用MotionEvent.ACTION_MOVE的情况来计算新的角度和渲染。ACTION_DOWN的情况只是保存起始这是行不通的,因为形状没有旋转 - 因为偏移角度在移动过程中被重新计算 - 这是我在这一点上的结果。)

+0

我只看到ACTION_DOWN。提到的ACTION_MOVE在哪里?你实际上只在ACTION_DOWN中做了一些事情,ACTION_MOVE – WarrenFaith

+0

我曾经拥有它(见附录),但没有任何东西(除了保存这些坐标)。我的问题是,ACTION_DOWN正在连续使用的过程中,它应该只是一次,在第一次触摸(我认为?) – Sam

+1

您尝试过'getActionMasked()'吗?执行所有ACTION_UP/DOWN/MOVE并记录它们以查看MOVE和/或UP是否被正确调用。 – WarrenFaith

回答

0

需要使用getActionMasked()而不是getAction()。请参阅WarrenFaith的评论。

0

它可能是你忘了在你的开关/箱子里放一个断言。因此,一旦ACTION_MOVE完成,ACTION_DOWN紧随其后

+0

我其实尝试过,但没有帮助。解决方案和沃伦的评论一样。谢谢。 – Sam