Как получить более быструю частоту касания для ACTION_MOVE - PullRequest
2 голосов
/ 15 декабря 2011

Я программирую игру, в которой, касаясь экрана, мяч следует за моим движением. Мой сенсорный код похож на это:

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

И, естественно, я обрабатываю событие OnDraw и рисую овал с помощью drawOval.

Когда приложение запускается в симуляторе, все работает в соответствии с инструкциями, но кажется, что при увеличении скорости касания (мыши) шарик движется с очень большой задержкой, поэтому, когда я прекращаю движение, я должен ждать до секунд, пока мяч достигает последней позиции. Есть ли способ увеличить частоту событий ACTION_MOVE для более быстрого запуска или улучшить общее поведение этой программы?

1 Ответ

1 голос
/ 15 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...