Задача таймера не выполняется точно - PullRequest
0 голосов
/ 05 февраля 2011

Я пытаюсь выполнить основную задачу поворота холста 20 раз второй таймер, но он не работает должным образом, и его отстающий. например, если я поверну прямоугольник на 0,3 градуса за 50 мс следует повернуть на 6 градусов в секунду, но это не так. Это действительно медленно вращается. Вот мой пример кода:

//Code for update task
class UpdateTimeTask extends TimerTask {

      public void run() {
              hndView.post(new Runnable() {
                   public void run() {
                           hndView.invalidate(); //this code invalidates custom view that calls onDraw to draw rotated hand
                   }
                 });
      }
}


//Code for onDraw method of custom view that needs to be update
@Override 
protected void onDraw(Canvas canvas){

    super.onDraw(canvas);

    //ang is angle to rotate and inc is float value of 0.3 degree to be incremented
    ang = ang + inc;
    if (ang >= 360) ang = ang - 360;
    canvas.rotate(ang, canvas.getWidth()/2, canvas.getHeight()/2);  
    canvas.drawRect((canvas.getWidth()/2 - 2), (canvas.getHeight()/2 - 125), (canvas.getWidth()/2 + 2), (canvas.getHeight()/2 + 10), mTextPaint);
    canvas.restore();

}

//code to schedule task
Timer timer = new Timer();
UpdateTimeTask tt = new UpdateTimeTask();
timer.schedule(tt, 0, 50);

Может кто-нибудь сказать мне, что я здесь не так делаю? Должен ли я использовать другой подход к выполнению этой задачи? Потому что в это трудно поверить что вы не можете иметь простой плавный поворот прямоугольника 20 раз одна секунда.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2011

Timer / TimerTask не должны быть точными и не должны использоваться для этой цели.Следуйте рецептам разработки 2D-игр, таким как пример LunarLander, который входит в ваш SDK.Или вы можете просто выполнить поиск в StackOverflow и найти все сортировки из полезных сообщений по теме .

1 голос
/ 05 февраля 2011

Я полагаю, что вы не используете SurfaceView.

Подобное рисование на холсте было предназначено для элементов управления, а не для быстрого рендеринга (чтение> 10 кадров в секунду)

Если вы хотите повысить производительность, вам нужно либо использовать SurfaceView, где в среднем вы получите30 кадров в секунду или opengl

Пожалуйста, прочитайте: http://developer.android.com/guide/topics/graphics/index.html

0 голосов
/ 05 февраля 2011

Количество вызовов для аннулирования не обязательно должно совпадать с количеством вызовов onDraw. Если ваш таймер запускается дважды подряд до того, как поток пользовательского интерфейса получит шанс на запуск, то двойной аннулирование закончится только одним поворотом. Попробуйте добавить код отладки для проверки количества вызовов этих двух методов.

...