2011-05-12 13 views
5

Czy istnieje sposób ustawienia obrazu tła SurfaceView? Czy to musi być zrobione w XML czy mogę zrobić to wszystko w Javie - Mam coś, co wygląda jak ten w moim konstruktora:Ustawianie obrazu tła obiektu SurfaceView

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

Ale to nadal nie pokazuje nic.

Odpowiedz

3

Nie można ustawić tła do narysowania na SurfaceView. Musisz sam narysować tło na powierzchni.

+0

Okay, więc w metodzie onDraw() zakładam? –

+0

Nie, onDraw() nie zrobi tego, co chcesz. Kiedy używasz SurfaceView albo renderujesz go w kontekście OpenGL, albo przechwytujesz płótno powierzchni przez SurfaceHolder. Musisz renderować swoje tło za pomocą tego Canvas (lub OpenGL, jeśli robisz OpenGL.) –

+1

Używam tylko Canvas - Po prostu próbuję dowiedzieć się, jak to zrobić z Canvas. –

4

Spróbuj

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

, w jaki sposób mogę nadać rozmiar układu rysunkowi bitmapowemu na płótnie i umieścić go w środku widoku powierzchni. –

6

Chociaż nie można bezpośrednio ustawić obraz tła do SurfaceView można pokrywać ImageView (wyświetlanie obrazu tła) a SurfaceView na górze to, co przejrzyste.

miałem problemy występy podczas rysowania mapy bitowej 1920x1080 jako tła dla każdego repaint SurfaceView: jedynym rozwiązaniem znalazłem (dzięki this answer) używał ImageView wyświetlania tego 1920x1080 (stałe) bitmapę, a przy moim SurfaceView na szczycie z tego, dzięki czemu jest przezroczysty, aby uniknąć malowania dużego obrazu tła dla każdej odmalowania SurfaceView. Teraz moja aplikacja jest znacznie gładsza, dzięki ten kod:

// 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); 

Wtedy zaczynasz „metoda malowania s z tym: (aby«wypłukać»poprzedni narysowanych obrazu w SurfaceView” Twoje SurfaceView buforze s)

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

Dziękuję człowieku! 2 dni próbowałem to zrobić! Po 5 latach to nadal ratuje czyjeś życie. –

+1

dziękuję bardzo ... że 'canvas.drawColor (0, PorterDuff.Mode.CLEAR);' is clutch! – annie

0

Mały dodatek do odpowiedzi przez Xav. którą chcesz ustawić widok zawartości jako rootPanel potem:

setContentView(rootPanel); 

Ponadto, ponieważ FILL_PARENT jest przestarzała, należy rozważyć użycie MATCH_PARENT w obu miejscach.