如何为ACTION_MOVE获得更快的触摸频率

时间:2011-12-15 13:16:59

标签: android android-layout

我正在编写一个游戏,当我触摸屏幕时,一个球跟着我的动作。 我的触摸代码类似于:

...
case MotionEvent.ACTION_MOVE:
ballX = currentX;
ballY = currentY;
invalidate(); 

我自然会处理OnDraw事件并使用drawOval绘制Oval。

当应用程序在模拟器中启动时,所有操作都按照指示工作,但似乎通过增加触摸(鼠标)的速度,球以非常高的延迟移动,因此当我停止移动时,我应该等到1当球到达最后位置时秒。有没有办法增加ACTION_MOVE事件的发生频率以更快地发射或改善该程序的整体行为?

1 个答案:

答案 0 :(得分:1)

您所描述的情况通常表示您正在接收 ACTION_MOVE 事件更快,而不是您正在处理它们。这会导致事件排队并在您抬起手指后进行处理。您的问题的根源很可能是,对 invalidate()的调用需要花费很多时间。

问题的一个可能解决方案是每N个事件处理一次 ACTION_MOVE 事件:

int moveEvtCnt = 0;  
int N = 5; // Handle every 5 movement events  
..
case MotionEvent.ACTION_MOVE:
if((moveEvtCnt % N) == 0) {
    ballX = currentX;
    ballY = currentY;
    invalidate();
}
moveEvtCnt++;

在上面的示例中,您将每5个样本处理 ACTION_MOVE 事件。由于 invalidate()的调用频率较低,因此可以更好地实时跟踪手指的动作,而不是浪费处理过去和不相关的事件。