2013-10-06 119 views
0

我試圖做一個簡單的應用程序,每隔500ms更改畫布背景色,在畫布上創建n個圓,每個圓都以x毫秒爲半徑變化半徑。如何在畫布上繪製多個繪圖而不繪製同步

我該怎麼做,如果我的睡眠時間在「run()」方法是由cavas顏色更改決定的。我應該爲每個圈子創建一個新線程並同步所有圈子嗎?

Cleary我還需要考慮到在畫布背景顏色變化之後必須繪製圓,因爲我會冒背景圖層被圈入的圓圈不可見的風險。

對於這種工作,我應該考慮使用opengl?

這是我的run():

public void run() { 
      int i=0; 
      Paint paint= new Paint(); 
      paint.setColor(Color.RED); 

      Log.d("ZR", "in running"); 
      while(running){ 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       if(!holder.getSurface().isValid()) 
        continue; 
       Canvas canvas = holder.lockCanvas(); 
       canvas.drawRGB(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)); 
       canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 100, paint); 
       holder.unlockCanvasAndPost(canvas); 
       Log.d("ZR", "in running: "+i +" count: "+j); 
       i++; 
       j++; 
      } 
     } 

回答

1

使用Thread.sleep()將實現定時器來觸發不同的繪圖程序的替代品。下面是一些僞代碼:

timeOfLastBackgroundChange = currentSystemTime() 
timeOfLastCircleResize = currentSystemTime() 
needsCanvasRedraw = false 

while(running) { 
    if (currentSystemTime() - timeOfLastBackgroundChange > 500) { 
     changeBGColor() 
     timeOfLastBackgroundChange = currentSystemTime() 
     needsCanvasRedraw = true 
    } 

    if (currentSystemTime() - timeOfLastCircleResize > n) { 
     resizeCircle() 
     timeOfLastCircleResize = currentSystemTime(); 
     needsCanvasRedraw = true 
    } 

    if (needsCanvasRedraw) { 
     drawUpdatedObjects() 
     needsCanvasRedraw = false 
    } 

基本上,你的循環中,你跟蹤你改變背景顏色和調整你的圈子中的最後一次。在循環的每一次迭代中,您都會檢查是否有足夠的時間來保證另一個背景更改或圓圈大小調整。如果有,則進行更改並記錄更改的當前時間,以便記錄下一次更改所用的時間。 needsCanvasRedraw標誌可以讓你只在某些東西改變而不是每次循環迭代時重繪。