Android SurfaceHolder.lockCanvas()返回null
我正在做一个游戏,因为我是Android新手,所以我根据这个例子进行设计。在其设计中,从Android SurfaceHolder.lockCanvas()返回null,android,surfaceholder,Android,Surfaceholder,我正在做一个游戏,因为我是Android新手,所以我根据这个例子进行设计。在其设计中,从GameActivity调用GameThread.doStart(),然后线程从其GameThread.run()循环运行所有内容,如下所示(为了清晰起见,大部分代码已被删除): 为了解决我遇到的一些问题,我尝试对游戏活动进行更多的控制,如下所示: public class GameActivity extends Activity { public void onCreate(Bundle sav
GameActivity
调用GameThread.doStart()
,然后线程从其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();
while (gameThread.isRunning())
{
gameThread.run();
}
}
}
除非我这样做,lockCanvas()
总是返回null,因此我无法在屏幕上绘制任何内容。正如我所说,我还是Android新手,所以我不知道为什么第二个案例不起作用。有人知道发生了什么或者为什么不起作用吗
编辑:根据我的测试,曲面从未创建过。在
GameView.onResume()
期间,我让活动在继续游戏之前等待曲面的创建,但它一直在等待。为什么第一个实例是创建曲面的唯一情况?您正在创建时启动thred in活动,而只有在创建并准备好SurfaceView后才应启动该活动。检查第二个SurfaceView示例:创建曲面后开始运行线程。i、 e.当您得到一个回调surfaceCreated()时,启动线程
代码片段
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
嘘你的建议是我已经在做的。我只是没有显示代码。我不会在活动暂停时关闭线程,只是设置一个布尔标志,这样线程循环就不会调用任何方法。在恢复时,我再次重置此标志,动画继续。。。如果曲面被破坏,则“在曲面上创建”将在下次创建一个新线程。如果未创建曲面,您可以检测此情况并重新启动活动。@Lumis,创建曲面视图时我正在启动线程,但场景是我正在为摄影机设置PreviewDisplay(holder)。当我使用getHolder.lockCanvas()时,它总是带着相机回来,这正是我正在做的。
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
{
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}