制作非线程菜单 - SurfaceView Android App

时间:2013-07-28 10:46:08

标签: android exception null drawing surfaceview

我写了一个游戏,我试图让它更好,摆脱错误,我有菜单和游戏状态本身依赖于一个线程,但对于菜单我锁定绘图,以便它绘制每个屏幕只有一次。我的手机在菜单上过热,所以我只想在游戏状态下创建线程,并使菜单独立于线程,例如重新绘制触摸。

我知道如何完成所有这些并且非常简单但是我得到了奇怪的错误,我的位图的空指针异常在线程打开时完美无缺。

我有一个onDraw(Canvas c)函数,我已经写了每个州的绘制内容(比如菜单或游戏状态)

在线程中它看起来像这样(只是绘图部分)

    c = null;
    c = holder.lockCanvas();
    synchronized(holder){
    onDraw(c);
    }
    holder.unlockCanvasAndPost(c);

现在我已经编写了一个简单的方法来调用以便在菜单中进行绘制

private void reDraw(){
menuCanvas = null;
menuCanvas = holder.lockCanvas();
synchronized(holder){
onDraw(menuCanvas);}
holder.unlockCanvasAndPost(menuCanvas);
}

在onSizeChanged方法中     @覆盖     protected void onSizeChanged(int w,int h,int oldw,int oldh){     screenW = w;     screenH = h;

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
while (bmpBackground==null){
if (screenW>500){
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
else{
bmploader =     BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet_small,options);
            bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
            if (bmploader!=null){
                bmploader.recycle();
                bmploader = null;
            }
        }
        }
        loadMusic();
        loadBitmaps();
        loadShip();
        changeState(states.TITLE);
        reDraw();
        super.onSizeChanged(w, h, oldw, oldh);
    }

它几乎告诉我bmpBackground是一个null并抛出一个bug。在我刚刚改为标题状态并正常绘制之前(使用线程绘图);

1 个答案:

答案 0 :(得分:0)

有时/经常,onSizeChanged连续多次被调用,第一次宽度和高度为w = 0且h = 0。

最好的办法是

a)添加一个检查以查看width = 0,如果是,则不执行任何操作(它将使用适当的尺寸再次调用它;您也不需要添加高度= 0的检查,因为要么w和h将为0或者它们将> 0并且您对位图创建的调用将运行而没有错误)

b)覆盖surfaceview的onSurfaceChanged而不是onSizeChanged,然后重新计算/创建你的位图。