2011-05-05 37 views
3

我試圖在畫布上移動一個球。 a和b類似於x,y座標位置。任何方式從我的代碼即時動態地嘗試獲取不同的值。 a,b是全局變量。但似乎「無效()」或刷新屏幕只發生在整個循環的末尾。你知道爲什麼嗎?。如果我必須在另一個線程上構建此代碼,請使用一些簡單的代碼向我建議。畫布不會更新(無效),直到整個循環結束時

private void shootBall(){ 
    while (a>b){ 
     a = getPositionX(); 
     b = getPositionY(); 
     invalidate(); 
     } 
    } 
} 

回答

1

像這樣做,並使用postInvalidate()代替:

private void shootBall(){ 

    new Thread(new Runnable() { 
     public void run() { 

      while (a>b){ 
       a = getPositionX(); 
       b = getPositionY(); 
       postInvalidate(); 
      } 

     } 
    }).start(); 
} 

編輯:但正如前面所提到的,不要假設無效刷新屏幕,它標誌着它作爲待重繪UI線程會繞過它。

+0

我已經在兩個Android OS 2.2上測試了這個解決方案。設備。一方面它工作順利,而另一方則嚴重困擾。 SurfaceView已被證明在各種設備上更可靠。 – Lumis 2011-05-07 14:30:30

10

我認爲這是更正確的說,你可以調用從一個循環內無效(),但該失效將不會被處理(畫布將不會重繪),直到循環完成。問題在於你在調用onDraw()方法的同一線程(UI工具包線程)上調用invalidate。因此,除非/直到您將控制權交還給工具包,否則無法進行渲染。因此,您的invalidate()調用實際上使視圖無效......但視圖不會重繪,直到循環完成並且函數返回。

在通過某個定時器調用的某個函數中(這實質上是動畫類所做的)更改位置更正確。在那個函數中,你會改變值,適當地invalidate(),然後返回。然後工具箱重新渲染場景,你的函數將獲得未來的回調並相應地更新位置。

+0

這是一個很好的解釋。 – Lumis 2011-05-07 14:00:56

0

用戶界面不能修改任何新的線程..你應該使用invalidate()在你的視圖相同的線程