Canvas不会更新(invalidate)直到整个while循环结束

时间:2011-05-05 18:29:19

标签: android

我正试图在画布上移动一个球。 a和b类似于x,y坐标位置。从我的代码中试图动态获取不同值的任何方式。 a,b是全局变量。但似乎“invalidate()”或屏幕刷新仅在整个循环结束时发生。你知道为什么吗?。如果我必须在另一个线程上构建它,请建议我一些简单的代码。

private void shootBall(){
    while (a>b){
        a = getPositionX();
        b = getPositionY();
        invalidate();
        }
    }
}

4 个答案:

答案 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()