我的Surface View无效

时间:2014-02-22 13:35:13

标签: android

这是主要方案:KillThemAll Game

在我的constructor扩展CustomView课程的SurfaceView中,我将background设置为:

this.setBackgroundDrawable(getResources().getDrawable(R.drawable.moon_light));

如果我在SurfaceHolder.Callback()的一种方法中设置背景,游戏和所有动画都会被冻结......

getHolder().addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            gameLoopThread.setRunning(false);
            while (retry) {
                try {
                    gameLoopThread.join();
                    retry = false;
                } catch (InterruptedException e) {}
            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            createSprites();
            gameLoopThread.setRunning(true);
            gameLoopThread.start();
           setBackgroundDrawable(getResources().getDrawable(R.drawable.moon_light));
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format,
                int width, int height) {
        }
    });

为什么?

3 个答案:

答案 0 :(得分:1)

在我看来你只想画一个背景。由于您已在onDraw()实现中覆盖SurfaceView来制作动画,因此您不应依赖View方法进行绘制,因为它们会与您的自定义绘图冲突。

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(background, 0, 0, null); // background replaces canvas.drawColor(Color.BLACK);
    // draw your sprites here
}

您必须确保background是一个大于画布大小的Bitmap。您也可以使用drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)将其缩放到正确的大小,但不会考虑宽高比。

答案 1 :(得分:0)

替换此行

this.setBackgroundDrawable(getResources().getDrawable(R.drawable.moon_light));

bm = BitmapFactory.decodeResource(getResources(), R.drawable.moon_light);

答案 2 :(得分:0)

我认为你在你的src和dest做出错误的反应。试着在日志上打印两者的值,看看它们是否正确