如何使用线程类调用SurfaceView的onDraw方法

时间:2013-08-24 07:18:55

标签: java android multithreading android-canvas surfaceview

因此,我一直试图弄清楚如何将形状和图像绘制到surfaceview。 iv一直在使用多个教程。但现在我输了。我有一个拥有我的游戏循环的线程,并且从我理解的是我在这个循环中拥有所有变量更新

public void run() {
    Canvas c;
    while (running) {
         c = null;
         try {
             c = surfaceHolder.lockCanvas(null);
             synchronized (surfaceHolder) {
              //Insert methods to modify positions of items in onDraw()
             }
         } finally {
             if (c != null) {
                 surfaceHolder.unlockCanvasAndPost(c);
             }
         }
    }

}

我有一个具有onDraw(Canvas画布)方法的surfaceView。假设我想在我的屏幕上添加椭圆,我如何从我的线程

中的while循环中执行此操作

我目前在我的线程类中有这些变量

private SurfaceHolder surfaceHolder;
private gameMain gamePanel; //my surfaceview class
private boolean running;

我需要在我的surfaceview类中使用它吗?

setWillNotDraw(false);

如果我完全错误的话,人们会指出它。我不想使用openGL或任何库

1 个答案:

答案 0 :(得分:1)

所以我给这个问题的解决方案是改变它所说的地方:

try {
    c = view.getHolder().lockCanvas();
    synchronized (view.getHolder()) {
        view.onDraw(c);
    }
    } finally {
        if (c != null) {
           view.getHolder().unlockCanvasAndPost(c);
        }
}

在GameLoopThread类的run()方法中:

try {
    c = view.getHolder().lockCanvas();
    synchronized (view.getHolder()) {
        if(c != null)
            view.onDraw(c);
    }
    } finally {
        if (c != null) {
           view.getHolder().unlockCanvasAndPost(c);
        }
}

要完成此活动并拨打另一个活动,我添加了一个名为GameOver的方法,效果很好:

private void GameOver() {
    gameLoopThread.setRunning(false);
    Context c = getContext();
    c.startActivity(intent); //intent must be declared
    ((Activity) Pruebas.this.getContext()).finish();
}

我希望这有助于某人。