我正在创建一个简单的OpenGL'app'来旋转三角形。我希望,在第一次触摸时,保存触摸位置对应的角度。然后,在运动时,将形状旋转与当前位置相对应的角度减去第一次触摸的角度。
我的理解是,第一步应该在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 :(得分:0)
可能是你忘记在你的交换机/案例中放置一个break语句。因此,一旦ACTION_MOVE完成,在
之后立即跟随ACTION_DOWN答案 1 :(得分:0)
需要使用getActionMasked()而不是getAction()。见WarrenFaith的评论。