使用addContentView在Android中创建游戏菜单

时间:2011-11-04 08:52:03

标签: android

我正在尝试为Android制作游戏。它基于2D地图,用户可以在屏幕上移动。屏幕上有几个按钮,例如“Shop”。当我用户按下按钮时,我想用界面填充屏幕。

到目前为止,我的方法如下:

我有一个mapView和一个地图线程

  • public class MapView extends SurfaceView implements SurfaceHolder.Callback {}

  • public class MapThread extends Thread { ... }

地图线程定期调用MapView中的onDraw方法,该方法将地图绘制到屏幕上,而MapView中的事件侦听器则处理移动地图。

对于商店,我有类似的设置,ShopThreadShopView。按下商店按钮后,我的想法是停止MapThread,然后启动ShopThread。这意味着只会调用ShopView的'onDraw'方法,允许我绘制商店界面。

在按下按钮时,我有以下代码: (我通过变量topPage

传递每个视图之间的活动
    mapThread.isRunning = false; //stop the map thread
    setVisibility(INVISIBLE);
    // add showView to the activity and start the ShopThread
    topPage.addContentView(shopView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                        ViewGroup.LayoutParams.FILL_PARENT) );
        shopView.startThread();

我的问题是,当试图访问商店时,游戏冻结了一段时间。屏幕保持黑色,大约30秒到一分钟没有响应。我还会从操作系统中收到“强制关闭”或“等待”错误消息。如果我按下等待,ShopView将偶尔开始正常工作。

我已将其缩小到我的ShopThread课程中的run方法。

public void run() {
    Canvas c;
    while (isRunning){
        c = null;
        try {
            c = ShopView.getHolder().lockCanvas(null);
            synchronized (ShopView.getHolder()) {
                if(c != null)
                ShopView.onDraw(c);
            }
        } finally {
            if( c != null){
                ShopView.getHolder().unlockCanvasAndPost(c);
            }
        }
    }
}

c = ShopView.getHolder().lockCanvas(null);只是返回null。我已将Log.v语句放在其他updateThreads中,它们似乎已全部停止。是什么在画布上保持锁定,是否有我遗漏的东西?

1 个答案:

答案 0 :(得分:0)

我发现了问题。我设法解决了这个问题,但我不确定为什么首先出现问题。

我最初在ShopView课程中创建了一个MapView对象,并在我想开始将商店绘制到画布时手动启动ShopThread。而不是这样,我改变了它,以便在surfaceCreated()函数

中创建并启动ShopView线程