在surfaceview的onDraw上有效地绘制相同图像的多个实例

时间:2012-04-27 22:07:02

标签: android surfaceview

我正在尝试制作一个在不同位置具有相同图像的许多实例的游戏。我希望一次声明图像,然后在onDraw()中使用该位图。但是,当我使用在类中声明的任何类型的变量时,我会收到一个错误,因为它会保留它的值。 我刚刚转到使用surfaceview,所以也许我错过了那些东西。我目前只是想绘制一个图像,但这个想法是一样的,一旦我到达多个实例就会被使用。 我现在拥有的:

class GameView extends SurfaceView implements SurfaceHolder.Callback
{
    private GameThread _thread;
    // vars for display, scale, etc
    private int displayWidth;
    private int displayHeight;
    private double scale;
    private Bitmap groundPic;

    public GameView(Context context) {
        super(context);
        // set the surface holder for callback
        getHolder().addCallback(this);
        _thread = new GameThread(getHolder(), this);
                displayWidth = getWidth();
        displayHeight = getHeight();
        scale = displayWidth / 512.0;   // ground image is 512;
    }
@Override
    public void onDraw(Canvas canvas)
    {

        groundPic = BitmapFactory.decodeResource(getResources(), R.drawable.ground);
        groundPic = Bitmap.createScaledBitmap(groundPic, displayWidth, 50, true);
        canvas.drawColor(getResources().getColor(R.color.background_colour));
        // draw ground                  
        canvas.drawBitmap(groundPic,0, getHeight() - 50, null);
    }

这会导致一个力因为displayWidth为0而关闭。我在构造函数中设置值是错误的吗?在创建视图之后和setContentView()之前,我尝试创建一个从我的活动调用的init()。 我知道如果我将所有设置放在onDraw()中,它会起作用,但我觉得它真的很低效。 我希望做的(但导致错误)是让init()和其中的内部设置groundPic这将是一个类变量,然后我的onDraw会小而快,因为它不会继续每个周期都有相同的位图对象。我将在地面上绘制30枚导弹,因此每次循环制作30个相同的位图将是一个巨大的浪费,当我可以制作一次,然后用特定位置绘制30次。 如果有人能帮我指出正确的方向让这个工作正常,那么我们将非常感激。

1 个答案:

答案 0 :(得分:0)

  

这会导致一个力因为displayWidth为0而关闭。我错了   在构造函数中设置值?

是的,因为正常行为表明SurfaceView在构建时尚未布局。相反,您应该使用SurfaceHolder.Callback来发现与SurfaceView大小和格式相关的任何更改。您的代码段表明您可能已经存在相关方法:

class GameView extends SurfaceView implements SurfaceHolder.Callback

由于您正在实施Callback,因此您应该在某处使用surfaceChanged(SurfaceHolder holder, int format, int width, int height)方法。您可以使用传入的widthheight参数来计算比例,并适当缩小Bitmap。同样,您可以在surfaceCreated(SurfaceHolder holder)中加载图像。

有关使用SurfaceView和线程图的更多提示,您可能需要查看Google的Lunar Lander sample project,尤其是LunarView类。