设置SurfaceView的背景图像

8
有没有一种方法可以设置SurfaceView的背景图像?它必须在xml中完成还是我可以在Java中完成 - 我在我的构造函数中得到了这样的东西:
Drawable sky = (getResources().getDrawable(R.drawable.sky));
    this.setBackgroundDrawable(sky);

但仍然没有显示任何内容。
4个回答

11
虽然你不能直接将背景图片设置为SurfaceView,但你可以在上面重叠一个ImageView(显示背景图片),并使其透明。我曾经在每次SurfaceView重绘时,绘制一个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的绘制方法(以便在SurfaceView的缓冲区中“刷新”先前绘制的图像):

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

2
谢谢你!我试了两天才做到这个! 5年后,它仍然能够拯救某人的生命。 - Jakub S.
2
非常感谢...canvas.drawColor(0, PorterDuff.Mode.CLEAR); 真是太关键了! - annie

4

你无法在SurfaceView上设置背景Drawable。你需要自己在表面上画出背景。


好的,在onDraw()方法中,我会假设? - Hani Honey
不,onDraw()不能达到你想要的效果。当你使用SurfaceView时,你要么使用OpenGL上下文来进行渲染,要么通过SurfaceHolder获取表面的Canvas。你必须使用该Canvas(或者如果你正在使用OpenGL,则使用OpenGL)来渲染你的背景。 - Romain Guy
1
我只使用Canvas - 我只是在尝试弄清楚如何使用Canvas实现它。 - Hani Honey
嗨,如何将图像调整到画布大小并居中于SurfaceView? - Sunishtha Singh
尽管从技术上讲,这个答案是正确的,但下面@xav 的回答提供了一个很好的替代方案,实现了OP所要求的功能。 - yajnesh

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

0
与xav的回答相比,这里有一个小补充。之后您想要将内容视图设置为rootPanel:
setContentView(rootPanel);

此外,由于FILL_PARENT已被弃用,请考虑在两个位置使用MATCH_PARENT。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接