如何控制Android SurfaceView(画布)重画

如何控制Android SurfaceView(画布)重画,android,android-canvas,surfaceview,redraw,Android,Android Canvas,Surfaceview,Redraw,我在一个网格中有几张图片。 看起来像这样: [http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2013/06/jolla4.jpg][1] 我没有使用android Gridview,而是使用了画布,因为图标需要设置动画。我读到我需要在游戏中使用画布 我正在使用SurfaceView(与线程结合)在屏幕上绘制图像 class MySurface extends SurfaceView implements SurfaceHolder

我在一个网格中有几张图片。 看起来像这样: [http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2013/06/jolla4.jpg][1]

我没有使用android Gridview,而是使用了画布,因为图标需要设置动画。我读到我需要在游戏中使用画布

我正在使用SurfaceView(与线程结合)在屏幕上绘制图像

 class MySurface extends SurfaceView implements SurfaceHolder.Callback {
@Override
    public void onDraw(Canvas canvas) {
        //here i create the bitmaps and draw the icons on the screen.

}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    thread.setRunning(false);
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {}
        }
    }
这一切都很好。Mysurface从我的主要活动中调用,代码如下:

setContentView(new MySurface());
问题是surfaceview的画布被随机重画。我想这样做,这样我就可以决定何时重画画布以及重画多少次。如何从主活动中调用onDraw函数?我不知道怎么做

我知道在线程是完成了

mySurface.onDraw(c)


每次屏幕刷新都会调用onDraw。屏幕刷新率取决于您的设备。如果刷新率为70,则每秒调用onDraw 70次。onDraw运行在一个单独的线程上,所以我不建议尝试从UI线程调用它来搞乱它。计算delta time,它是自上次调用onDraw以来经过的时间。假设你想为位图设置每秒50像素的动画,然后说 x+=deltaTime*50

这将使位图在x轴上每秒仅移动50个像素

如果你只是说 x+=1


您的位图将每秒移动屏幕刷新次数。由于所有设备的刷新率都不同,因此需要使用增量时间,以便在所有设备中以相同的速度更新屏幕。否则,您的动画速度会因设备而异。

我看到还有invalidate()。这是一种重新绘制视图的方法。“这必须从UI线程调用。”在onDraw中调用invalidate以告知应再次调用onDraw。它由SurfaceView创建的线程调用。