我正试图在画布上移动一个球。 a和b类似于x,y坐标位置。从我的代码中试图动态获取不同值的任何方式。 a,b是全局变量。但似乎“invalidate()”或屏幕刷新仅在整个循环结束时发生。你知道为什么吗?。如果我必须在另一个线程上构建它,请建议我一些简单的代码。
private void shootBall(){
while (a>b){
a = getPositionX();
b = getPositionY();
invalidate();
}
}
}
答案 0 :(得分:11)
我认为你可以在循环中调用invalidate()更正确,但是在循环完成之前不会处理失效(画布不会被重绘)。问题是你在同一个线程(UI工具包线程)上调用invalidate,就像调用你的onDraw()方法一样。因此,除非/直到您将控制权交还给工具包,否则它无法进行渲染。因此,您的invalidate()调用实际上会使视图无效......但是在循环完成并且函数返回之后,视图才会被重绘。
更改某些通过某个计时器调用的函数的位置更为正确(这实际上是动画类所做的)。在该函数中,您将更改值,适当地使invalidate()和返回。然后工具包重新渲染场景,您的函数将获得未来的回调并相应地更新位置。
答案 1 :(得分:2)
这样做,并改为使用postInvalidate():
private void shootBall(){
new Thread(new Runnable() {
public void run() {
while (a>b){
a = getPositionX();
b = getPositionY();
postInvalidate();
}
}
}).start();
}
编辑:但如前所述,不要假设无效重绘屏幕,它会将其标记为要重绘,并且UI线程将绕过它。
答案 2 :(得分:0)
你可以在onDraw()的末尾加上invalidate(),如下例所示:How can I use the animation framework inside the canvas?
然而,这在某些设备上运行良好,而瓶颈却在其他设备上慢下来。
要使用线程和SurfaceView,请浏览所有这些教程:http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html
答案 3 :(得分:0)
UI无法从任何新线程修改..你应该在你的视图所在的同一个线程中使用invalidate()