设置SurfaceView的背景图像

时间:2011-05-12 16:16:24

标签: java android background-image drawable surfaceview

有没有办法设置SurfaceView的背景图像?是否必须在xml中完成或者我可以用Java完成所有操作 - 我的构造函数中有一些看起来像这样的内容:

Drawable sky = (getResources().getDrawable(R.drawable.sky));
    this.setBackgroundDrawable(sky);

但它仍然没有显示任何内容。

5 个答案:

答案 0 :(得分:6)

试试这个

public void surfaceCreated(SurfaceHolder arg0) {
    Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.background);
    float scale = (float)background.getHeight()/(float)getHeight();
    int newWidth = Math.round(background.getWidth()/scale);
    int newHeight = Math.round(background.getHeight()/scale);
    Bitmap scaled = Bitmap.createScaledBitmap(background, newWidth, newHeight, true);
}

public void onDraw(Canvas canvas) {
    canvas.drawBitmap(scaled, 0, 0, null); // draw the background
}

答案 1 :(得分:6)

虽然您无法直接将背景图片设置为SurfaceView,但您可以将ImageView(显示背景图片)与SurfaceView重叠在此之上,使它透明。

我在绘制一个1920x1080位图作为每个SurfaceView重绘的背景图像时遇到了性能问题:我找到的唯一解决方案(感谢this answer)使用显示此1920x1080(固定)位图的ImageView ,并在其上使用我的SurfaceView,使其透明,以避免为每个SurfaceView重绘绘制大背景图像。现在我的应用程序更顺畅了,多亏了这段代码:

// Setup your SurfaceView
SurfaceView surfaceView = ...;  // use any SurfaceView you want
surfaceView.setZOrderOnTop(true);
surfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT);

// Setup your ImageView
ImageView bgImagePanel = new ImageView(context);
bgImagePanel.setBackgroundResource(...); // use any Bitmap or BitmapDrawable you want

// Use a RelativeLayout to overlap both SurfaceView and ImageView
RelativeLayout.LayoutParams fillParentLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);
RelativeLayout rootPanel = new RelativeLayout(context);
rootPanel.setLayoutParams(fillParentLayout);
rootPanel.addView(surfaceView, fillParentLayout); 
rootPanel.addView(bgImagePanel, fillParentLayout); 

然后你将用这个开始你的SurfaceView绘画方法:(为了#34;刷新" SurfaceView' s中先前绘制的图像缓冲液)

canvas.drawColor(0, PorterDuff.Mode.CLEAR);

答案 2 :(得分:4)

您无法在SurfaceView上设置背景可绘制。您必须自己将背景绘制到表面上。

答案 3 :(得分:1)

your surfaceView.setBackground(getResources().getDrawable(R.drawable.?));

答案 4 :(得分:0)

xav对答案的一点补充。您之后想要将内容视图设置为rootPanel:

setContentView(rootPanel);

此外,由于不推荐使用FILL_PARENT,请考虑在两个地方使用MATCH_PARENT。