Установка фонового изображения SurfaceView
есть ли способ установить фоновое изображение SurfaceView? Нужно ли это делать в xml или я могу сделать все это на Java - у меня есть что-то, что выглядит так в моем конструкторе:
Drawable sky = (getResources().getDrawable(R.drawable.sky));
this.setBackgroundDrawable(sky);
но он по-прежнему ничего не показывает.
5 ответов
вы не можете установить фоновый рисунок на SurfaceView. Вам придется самому нарисовать фон на поверхности.
попробуй такое
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
}
в то время как вы не можете напрямую установить фоновое изображение в SurfaceView
, вы можете перекрывал ImageView
(отображение фонового изображения) и SurfaceView
поверх этого, делая его прозрачным.
у меня были проблемы с производительностью при рисовании растрового изображения 1920x1080 в качестве фонового изображения для каждой перерисовки SurfaceView: единственное решение, которое я нашел (благодаря ответ) использовал ImageView
отображение этого 1920x1080 (фиксированного) растрового изображения и использование my 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
метод рисования с этим: (для того, чтобы "смыть" предыдущее нарисованное изображение в С)
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
небольшое дополнение к ответу xav. Вы хотите установить в виде rootPanel после:
setContentView(rootPanel);
кроме того, поскольку FILL_PARENT устарел, рассмотрите возможность использования MATCH_PARENT в обоих местах.