2011-02-27 51 views
0

我打算在一個視圖中不斷運動的UI元素可以接受的方法。我想最好的辦法是隻具有一個定時器,在視圖中運行,並要求更新我的對象的狀態,並調用無效的方法。調用View.invalidate上重複的計時器

什麼是與(定時器,TimerTask的,處理程序)和如何做到這一點的最好的對象是表現最好的辦法做到這一點。我需要避免表現出任何缺陷嗎?

此外,什麼是迭代之間的時間可以接受的金額是多少?有沒有標準,還是取決於被繪製物體的複雜性和數量?

回答

3

如果您要更新UI元素,最好使用View的postDelayed()postInvalidateDelayed()方法。他們保證它將被安排在UI線程和重繪。

迭代是不是太事項。我曾經制作過一個「秒錶」計時器,其運行速度爲40+ fps,而且用戶界面響應時間足夠長。請注意,無論您放置在postDelay中的哪個runnable都將在UI線程上運行,因此,如果您需要執行一些繁重的繪製工作,我會在一個單獨的位圖中準備(在第二個線程中),並在繪圖完成後立即發佈位圖雙緩衝技術)

=更新= 我以前所做的是,我需要在視圖上畫一些東西,整個繪圖需要大約200毫秒才能完成。我這樣做的方式是這樣的(假設運行在比UI線程以外的單獨的線程):

Bitmap result; 
void run(){ 
    while(running){ 
     result = doTheHeavyWeightDrawing(); 
     post(new Runnable(){ 
      setBackgroundDrawable(new BitmapDrawable(...)); 
     }); 
     try{ 
      sleep(100); 
     }catch(InterruptedException e){ return; } 
    } 
} 
+0

因此,對於重複的任務你會打電話postDelayed從查看啓動循環,然後在了Runnable那得到執行調用postDelayed再次繼續循環? – Rich 2011-02-27 01:37:18

+0

@很好,我更新了我的答案,類似於我之前所做的,除了使用帖子而不是延遲。請記住,無論在'postDelayed'中運行的任何內容都將在View Thread中執行,並且會阻止用戶界面的性能。在View Thread中嘗試儘可能少地做到最好。 – xandy 2011-02-27 04:28:48