我打算在一個視圖中不斷運動的UI元素可以接受的方法。我想最好的辦法是隻具有一個定時器,在視圖中運行,並要求更新我的對象的狀態,並調用無效的方法。調用View.invalidate上重複的計時器
什麼是與(定時器,TimerTask的,處理程序)和如何做到這一點的最好的對象是表現最好的辦法做到這一點。我需要避免表現出任何缺陷嗎?
此外,什麼是迭代之間的時間可以接受的金額是多少?有沒有標準,還是取決於被繪製物體的複雜性和數量?
我打算在一個視圖中不斷運動的UI元素可以接受的方法。我想最好的辦法是隻具有一個定時器,在視圖中運行,並要求更新我的對象的狀態,並調用無效的方法。調用View.invalidate上重複的計時器
什麼是與(定時器,TimerTask的,處理程序)和如何做到這一點的最好的對象是表現最好的辦法做到這一點。我需要避免表現出任何缺陷嗎?
此外,什麼是迭代之間的時間可以接受的金額是多少?有沒有標準,還是取決於被繪製物體的複雜性和數量?
如果您要更新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; }
}
}
因此,對於重複的任務你會打電話postDelayed從查看啓動循環,然後在了Runnable那得到執行調用postDelayed再次繼續循環? – Rich 2011-02-27 01:37:18
@很好,我更新了我的答案,類似於我之前所做的,除了使用帖子而不是延遲。請記住,無論在'postDelayed'中運行的任何內容都將在View Thread中執行,並且會阻止用戶界面的性能。在View Thread中嘗試儘可能少地做到最好。 – xandy 2011-02-27 04:28:48