我正在尝试制作一个在不同位置具有相同图像的许多实例的游戏。我希望一次声明图像,然后在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次。 如果有人能帮我指出正确的方向让这个工作正常,那么我们将非常感激。
答案 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)
方法。您可以使用传入的width
和height
参数来计算比例,并适当缩小Bitmap
。同样,您可以在surfaceCreated(SurfaceHolder holder)
中加载图像。
有关使用SurfaceView
和线程图的更多提示,您可能需要查看Google的Lunar Lander sample project,尤其是LunarView
类。