While you can't directly set a background image to a SurfaceView
, you can overlap an ImageView
(displaying your background image) and your SurfaceView
on top of this, making it transparent.
I had performances issues when drawing a 1920x1080 bitmap as a background image for each SurfaceView repaint: the only solution I found (thanks to this answer) was using an ImageView
displaying this 1920x1080 (fixed) bitmap, and using my SurfaceView
on top of it, making it transparent, to avoid painting the big background image for each SurfaceView
repaint. Now my app is much smoother, thanks to this code:
// 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);
Then you shall start your SurfaceView
's paint method with this: (in order to "flush" the previous drawn image in SurfaceView
's buffer)
canvas.drawColor(0, PorterDuff.Mode.CLEAR);