我计划在视图中持续移动UI元素。我认为最好的方法是在View中运行一个Timer,并调用一个方法来更新对象的状态并调用invalidate。
使用(Timer,TimerTask,Handler)执行此操作的最佳对象是什么,以及执行此操作的最佳方法是什么。是否有任何陷阱需要避免表现?
此外,迭代之间的可接受时间是多少?是否有标准,还是取决于被绘制对象的复杂程度和数量?
答案 0 :(得分:3)
如果要更新UI元素,最好使用View的postDelayed()
或postInvalidateDelayed()
方法。他们保证会在UI线程和重绘中安排它。
迭代不是太重要。我曾经制作了一个“停止观看”计时器,运行速度超过40+ fps,而且UI仍然足够响应。请注意,你在postDelay中放置的任何runnable都将在UI的线程上运行,因此,如果你需要做一些重绘,我会在一个单独的Bitmap中准备(在第二个线程中),并在绘图完成时发布位图(双缓冲技术)
=更新= 我之前做的是,我需要在视图上绘制一些东西,整个绘图需要大约200ms才能完成。我这样做是这样的(假设运行在除UI线程之外的单独线程中):
Bitmap result;
void run(){
while(running){
result = doTheHeavyWeightDrawing();
post(new Runnable(){
setBackgroundDrawable(new BitmapDrawable(...));
});
try{
sleep(100);
}catch(InterruptedException e){ return; }
}
}