Установите фоновое изображение SurfaceView - PullRequest
7 голосов
/ 12 мая 2011

Есть ли способ установить фоновое изображение SurfaceView? Должно ли это быть сделано в XML или я могу сделать все это на Java - у меня есть что-то похожее на это в моем конструкторе:

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

Но это все еще ничего не показывает.

Ответы [ 5 ]

6 голосов
/ 26 июня 2012

Попробуйте это

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
}
6 голосов
/ 22 июля 2014

Хотя вы не можете напрямую установить фоновое изображение на 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);
4 голосов
/ 12 мая 2011

Вы не можете установить фон для рисования в SurfaceView. Вы должны будете нарисовать фон на поверхности самостоятельно.

1 голос
/ 30 сентября 2018
your surfaceView.setBackground(getResources().getDrawable(R.drawable.?));
0 голосов
/ 20 ноября 2017

Небольшое дополнение к ответу от xav. Вы хотели бы установить представление содержимого как rootPanel впоследствии:

setContentView(rootPanel);

Кроме того, поскольку FILL_PARENT устарела, рассмотрите возможность использования MATCH_PARENT в обоих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...