android - SurfaceHolder.lockCanvas() 返回 null

标签 android surfaceholder

我正在制作游戏,由于我是 Android 的新手,所以我的设计基于示例 LunarLander code .在其设计中,GameThread.doStart()GameActivity 调用,然后该线程从其 GameThread.run() 循环运行所有内容,如下所示如下所示(为清楚起见,已删除大部分代码):

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();
        gameThread.doStart();
    }
}

.

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        while (running)
        {
            Canvas c = null;
            try
            {
                c = mSurfaceHolder.lockCanvas();
                // Use canvas
            }
            finally
            {
            }
        }
    }
}

为了尝试解决我遇到的一些问题,我尝试将更多控制权交给 GameActivity,如下所示:

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();

        while (gameThread.isRunning())
        {
            gameThread.run();
        }
    }
}

.

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        Canvas c = null;
        try
        {
            c = mSurfaceHolder.lockCanvas();
            // Use canvas
        }
        finally
        {
        }
    }
}

除非我这样做,lockCanvas() 总是返回 null,因此我无法在屏幕上绘制任何东西。正如我所说,我还是 Android 的新手,所以我不知道为什么第二种情况不起作用。任何人都知道发生了什么或为什么它不起作用?

编辑:根据我的测试,从未创建表面。在 GameView.onResume() 期间,我让 Activity 在继续游戏之前等待表面创建,但它一直在等待。为什么第一个实例是创建表面的唯一情况?

最佳答案

您在创建 Activity 时启动了线程,而它应该仅在创建 SurfaceView 并准备就绪时启动。检查第二个,SurfaceView 示例:How can I use the animation framework inside the canvas?

关于android - SurfaceHolder.lockCanvas() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921412/

相关文章:

java - IsoDep.transceive(command) 以 [110, 0] 字节响应?

android - lockCanvas 方法在游戏循环中偶尔出现卡顿/滞后

android - SurfaceHolder.lockCanvas() 返回 null

java - Android Surface类Surface.ROTATION_无法解析或不是字段

android - 创建 Android Library 项目 jar

android - LogCat 停止工作

java - libGDX Box2D 在从地面掉落之前转身

java - 获取当前正在执行的方法的名称

java - 屏幕方向更改时 lockCanvas 失败

android - 在相机预览上移动叠加图像