2011-02-27 54 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