Хотя вы не можете напрямую установить фоновое изображение на SurfaceView
, вы можете перекрывать ImageView
(отображение фонового изображения) и ваш SurfaceView
поверх этого, делая его прозрачным.
У меня были проблемы с производительностью при рисовании растрового изображения 1920x1080 в качестве фонового изображения для каждого перекрашивания SurfaceView: единственное решение, которое я нашел (благодаря этот ответ ), было использование ImageView
для отображения этого 1920x1080 (исправлено) растровое изображение и использование моего 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);