Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用thread类调用SurfaceView的onDraw方法_Java_Android_Multithreading_Android Canvas_Surfaceview - Fatal编程技术网

Java 如何使用thread类调用SurfaceView的onDraw方法

Java 如何使用thread类调用SurfaceView的onDraw方法,java,android,multithreading,android-canvas,surfaceview,Java,Android,Multithreading,Android Canvas,Surfaceview,所以我一直在想如何在surfaceview上绘制形状和图像。我一直在使用多个教程。但是现在我迷路了。我有一个线程,有我的游戏循环,据我所知,我将在这个循环中有所有变量更新 public void run() { Canvas c; while (running) { c = null; try { c = surfaceHolder.lockCanvas(null); synchronized

所以我一直在想如何在surfaceview上绘制形状和图像。我一直在使用多个教程。但是现在我迷路了。我有一个线程,有我的游戏循环,据我所知,我将在这个循环中有所有变量更新

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 Canvas)方法的surfaceView。假设我想在我的屏幕上添加椭圆,那么如何在我的线程中通过while循环实现呢

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

private SurfaceHolder surfaceHolder;
private gameMain gamePanel; //my surfaceview class
private boolean running;
我的surfaceview课程需要这个吗

setWillNotDraw(false);

如果我完全做错了,人们会指出这一点。我不希望使用openGL或任何库

,因此我给出的解决方案是更改其中的内容:

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();
}

我希望这对某人有所帮助。

所以我给出的解决方案是改变它所说的:

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();
}

我希望这对某人有所帮助。

onDraw正在调用可疑的方法。尽管如此,还是可以使用它吗?onDraw正在进行可疑的方法调用。尽管如此,还是可以使用它吗?