SurfaceView

La clase SurfaceView se usa en juegos que necesitan un nivel bastante alto de potencia a la hora de repintar la pantalla.
En el siguiente ejemplo se muestra una imagen a través de SurfaceView
public class Game extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GameView(this));
}
}
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
private Bitmap bmp;
private int width, height;
private SurfaceHolder holder;
public GameView(Context context) {
super(context);
getHolder().addCallback(this);
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
this.width = width;
this.height = height;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas(null);
onDraw(c);
holder.unlockCanvasAndPost(c);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}
}
Se crea una clase que herede SurfaceView e implemente SurfaceHolder.callback para usar los métodos de esta última interfaz:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
No se puede manejar directamente el objeto Surface, se debe hacer a través de un SurfaceHolder (un contenedor) que se consigue llamando en el constructor de la clase a getHolder() e indicar que SurfaceHolder va a recibir las llamadas del SurfaceHolder.callback:
getHolder().addCallback(this);
Las siguiente tres funciones son propias del interfaz SurfaceHolder.Callback y se llaman en caso de que cambie el tamaño de la pantalla (por ejemplo al girar el teléfono), al crear la View y cuando se cierra.
La primera actualiza los atributos de ancho y alto de la pantalla
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
this.width = width;
this.height = height;
}
La segunda crea la View:
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas(null);
onDraw(c);
holder.unlockCanvasAndPost(c);
}
La tercera se usa para cerrar la pantalla:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
Sobrescribimos el método onDraw() para que dibuje la imagen en la pantalla:
@Override
public void onDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}









