我打算在一个视图中不断运动的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