2012-03-21 2 views
0

Я пытаюсь сделать меню на основе растровых изображений. Само меню должно перемещаться через события перемещения screentouch, в основном я хочу перетащить кнопки вокруг на вид. Кнопка также включает обнаружение столкновения, поэтому всякий раз, когда они касаются друг друга, они отскакивают друг от друга.Мерцание при рисовании растровых изображений с холстом в Android

Но у меня есть некоторые проблемы, когда дело доходит до рисования моих растровых изображений. В настоящее время я использую прямоугольник для масштабирования растрового изображения, чтобы оно соответствовало окну моего устройства. Хочу, чтобы я хотел и не могу получить в настоящее время для более плавного перемещения моих растровых изображений без мерцания. Единственная возможность перейти к открытию gl? Или я пропустил что-то большое в своем коде?

Это в моем представлении поверхности для рисования каждой кнопки, где MenuButton - это класс, который содержит растровое изображение и обновляет его положение в соответствии с движением касания и перетаскивания.

protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.WHITE); 

    for(MenuButton menuButton : menuButtonSprites) { 
     menuButton.onDraw(canvas); 
    } 
} 

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

public MenuButton(MenuView v, Bitmap bmp, int yPosition){ 
    this.menuView = v; 
    this.menuButton = bmp; 
    this.xMax = v.getWidth(); 
    this.yPosistion = yPosition; 
    menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax); 
} 

public void update(int y){ 
    if(menuButtonPressed) 
    { 
     this.yPosistion = y; 
     menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax); 
    } 
} 

public void onDraw(Canvas canvas){ 
    canvas.drawBitmap(menuButton, null, menuButtonRectangle, null); 
} 

У меня есть поток, который обновляет жеребьевку

public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    Canvas c = null; 

    while (running) { 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } 
     finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 

     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(10); 
     } 
     catch (Exception e) { 
     } 
    } 
} 

Я не знаю, что я делаю неправильно и почему я не могу добиться плавного движения моих кнопок. Это недостаток в использовании холста или я пропустил что-то действительно важное: D?

ответ

0

Обычно эта проблема возникает, когда есть проблема с синхронизацией при рисовании. Это может быть связано с более высокой частотой кадров или может быть более низкой частотой кадров. Эта проблема может быть устранена путем двойной буферизации или настройки частоты кадров.

Двойная буферизация. Вместо того, чтобы рисовать изображение непосредственно на основном холсте, мы создадим пустую растровую карту размера экрана и получим графический объект. Рисование каждой вещи на растровое изображение, а затем прямое рисование этого растрового изображения на основной холст.

+0

Thx, yep проверили, чтобы настроить частоту кадров, но без каких-либо успехов. Я попробую двойную буферизацию и вернусь к вам! – Ghostcloud

+0

Кажется, что когда вы блокируете холст и рисуете, а затем разблокируете холст с помощью unlockCanvasAndPost (c), вы уже рисуете следующий кадр. [Двойная буферизация] (http://stackoverflow.com/questions/6538423/double-buffering-in-java-on-android-with-canvas-and-surfaceview) – Ghostcloud

+0

О, это хорошо. Спасибо за информацию. lemme переосмыслить эту проблему. – Pavandroid

Смежные вопросы