Ситуация, которую вы описываете, обычно указывает на то, что вы получаете 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 () вызывается реже, он может лучше отслеживать движение пальца в реальном времени, вместо того, чтобы тратить время на обработку прошлых и не относящихся к делу событий.