2011-12-15 87 views
1

我正在编写一个游戏,当我触摸屏幕时,一个球跟随着我的动作。 我触摸代码类似于此:如何为ACTION_MOVE获得更快的触摸频率

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

,自然我处理的OnDraw事件和绘图与drawOval椭圆形。

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

回答

1

你通常描述的情况表明,您收到的ACTION_MOVE事件更快比你处理它们。这会导致事件在您抬起手指后排队并处理。问题的根源很可能是,致电invalidate()需要很长时间。

一个可能的解决问题的方法可以处理一个ACTION_MOVE事件每隔N个事件一次:

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++; 

在上面的例子中,你会处理ACTION_MOVE事件每5个样品。由于invalidate()被称为次数较少,因此它可以更好地实时跟踪手指的运动,而不是浪费处理时间来处理过去和不相关的事件。

+0

我试了这个..也试图使只有真正需要的矩形无效,但情况几乎是一样的..只有一点点更好。你知道为这种特殊情况找到一个代码示例吗? – 2011-12-15 22:12:32