2011-05-12 23 views
5

¿Hay alguna manera de establecer la imagen de fondo de un SurfaceView? ¿Tiene que ser hecho en xml o puede hacer que todo en Java - Tengo algo que se parece a esto en mi constructor:Establecer la imagen de fondo de un SurfaceView

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

Pero todavía no muestra nada.

Respuesta

3

No puede establecer un fondo dibujable en un SurfaceView. Tendrás que dibujar el fondo en la superficie tú mismo.

+0

Bien, entonces en el método onDraw() supongo? –

+0

No, onDraw() no hará lo que quiera. Cuando utiliza un SurfaceView, puede procesarlo usando un contexto OpenGL o agarra el lienzo de la superficie a través del SurfaceHolder. Debes renderizar tu fondo usando ese Lienzo (u OpenGL si estás haciendo OpenGL). –

+1

Solo estoy usando un Lienzo - Solo estoy tratando de descubrir cómo haría eso con el Lienzo. –

4

probar este

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

cómo puedo dar el tamaño de diseño al dibujo de mapa de bits en el lienzo y colocarlo en el centro de la vista de superficie. –

6

Si bien no se puede establecer directamente una imagen de fondo a un SurfaceView, puede superponerse una ImageView (que muestra la imagen de fondo) y su SurfaceView en la parte superior de esta, por lo que es transparente.

que tenían problemas de rendimiento en la elaboración de un mapa de bits 1920x1080 una imagen de fondo para cada repinte SurfaceView como: la única solución que encontré (gracias a this answer) fue el uso de un ImageView mostrar este 1920x1080 mapa de bits (fijo), y el uso de mi SurfaceView en la parte superior de eso, haciéndolo transparente, para evitar pintar la gran imagen de fondo para cada repintado de SurfaceView. Ahora mi aplicación es mucho más suave, gracias a este código:

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

A continuación, se iniciará 'método de pintura s con esto: (con el fin de 'limpiar' la imagen dibujada previa en SurfaceView' sus SurfaceView búfer s)

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

Gracias hombre! ¡Estuve 2 días intentando hacer eso! Después de 5 años, esto aún salva la vida de alguien. –

+1

muchas gracias ... que 'canvas.drawColor (0, PorterDuff.Mode.CLEAR);' es clutch! – annie

0

Una pequeña adición a la respuesta de xav. Lo que quiere establecer la vista de contenido como rootPanel después:

setContentView(rootPanel); 

Además, dado que FILL_PARENT está en desuso, considerar el uso de MATCH_PARENT en ambos lugares.

Cuestiones relacionadas