我正在编写一个游戏,当我触摸屏幕时,一个球跟着我的动作。 我的触摸代码类似于:
...
case MotionEvent.ACTION_MOVE:
ballX = currentX;
ballY = currentY;
invalidate();
我自然会处理OnDraw事件并使用drawOval绘制Oval。
当应用程序在模拟器中启动时,所有操作都按照指示工作,但似乎通过增加触摸(鼠标)的速度,球以非常高的延迟移动,因此当我停止移动时,我应该等到1当球到达最后位置时秒。有没有办法增加ACTION_MOVE事件的发生频率以更快地发射或改善该程序的整体行为?
答案 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()的调用频率较低,因此可以更好地实时跟踪手指的动作,而不是浪费处理过去和不相关的事件。