2011-05-12 5 views
5

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

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

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

ответ

3

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

+0

Хорошо, поэтому в методе onDraw() я предполагаю? –

+0

Нет, onDraw() не будет делать то, что вы хотите. Когда вы используете SurfaceView, вы либо визуализируете его, используя контекст OpenGL, либо захватываете холст поверх SurfaceHolder. Вы должны сделать свой фон, используя Canvas (или OpenGL, если вы используете OpenGL.) –

+1

Я использую Canvas - я просто пытаюсь понять, как я буду делать это с Canvas. –

4

Попробуйте

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 
} 
+1

как я могу придать размер макета чертежу растрового изображения на холсте и поместить его в центр обзора поверхности. –

6

В то время как вы не можете напрямую установить фоновое изображение в SurfaceView, вы можете перекрывать ImageView (отображение фонового изображения), и ваш SurfaceView на вершине этого, делая его прозрачным.

меня были проблемы перформанс при рисовании 1920х1080 растрового изображения в качестве фонового изображения для каждого SurfaceView перекрашивать: единственное решением, которое я нашел (спасибо this answer) было использование ImageView отображения этого 1920х1080 (фиксированные) растровых изображений, используя мой 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 буфера s)

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

Спасибо, человек! 2 дня я пытался это сделать! Через 5 лет это все еще спасает чью-то жизнь. –

+1

большое спасибо ... что 'canvas.drawColor (0, PorterDuff.Mode.CLEAR);' сцепление! – annie

0

Небольшое дополнение к ответу xav. Вы хотели бы установить вид контента, как RootPanel впоследствии:

setContentView(rootPanel); 

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

Смежные вопросы