2011-05-12 9 views
5

C'è un modo per impostare l'immagine di sfondo di un SurfaceView? Ha deve essere fatto in XML o posso fare tutto in Java - Ho qualcosa che assomiglia a questo nel mio costruttore:Impostare l'immagine di sfondo di SurfaceView

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

Ma ancora non mostra nulla.

risposta

3

Non è possibile impostare uno sfondo disegnabile su SurfaceView. Dovrai disegnare lo sfondo sulla superficie da solo.

+0

Ok, quindi nel metodo onDraw() presumerei? –

+0

No, onDraw() non farà quello che vuoi. Quando si utilizza un SurfaceView si esegue il rendering in esso utilizzando un contesto OpenGL o si acquisisce la superficie della superficie attraverso SurfaceHolder. Devi rendere il tuo sfondo usando quel Canvas (o OpenGL se stai facendo OpenGL.) –

+1

Sto solo usando un Canvas - Sto solo cercando di capire come lo farei con il Canvas. –

4

Prova questa

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

come posso dare la dimensione del layout al disegno bitmap su tela e posizionandolo al centro di surfaceview. –

6

Mentre non è possibile impostare direttamente un'immagine di sfondo a una SurfaceView, è possibile sovrapporre un ImageView (che visualizza l'immagine di sfondo) e il vostro SurfaceView in cima a questa, rendendolo trasparente.

ho avuto problemi di prestazioni quando si disegna una bitmap 1920x1080 come immagine di sfondo per ogni riverniciare SurfaceView: l'unica soluzione che ho trovato (grazie a this answer) stava usando un ImageView la visualizzazione di questa 1920x1080 bitmap (fisso), e usando il mio SurfaceView in cima di esso, rendendolo trasparente, per evitare di dipingere la grande immagine di sfondo per ogni riverniciatura SurfaceView. Ora la mia app è molto più agevole, grazie a questo codice:

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

Poi si deve avviare 'metodo paint s con questo: (al fine di 'svuotare' l'immagine disegnata precedente SurfaceView' tuoi SurfaceView tampone s)

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

Grazie amico! 2 giorni stavo cercando di farlo! Dopo 5 anni questo salva ancora la vita di qualcuno. –

+1

grazie mille ... che 'canvas.drawColor (0, PorterDuff.Mode.CLEAR);' è clutch! – annie

0

Una piccola aggiunta alla risposta di xav. Che ci si vuole impostare la visualizzazione di contenuti come rootPanel seguito:

setContentView(rootPanel); 

Inoltre, dal momento che FILL_PARENT è deprecato, considerare l'utilizzo di MATCH_PARENT in entrambi i luoghi.