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);
	}
Advertisement
    • juan pedro
    • 29/11/11

    hola,
    sale errores,

    Description Resource Path Location Type
    The method surfaceChanged(SurfaceHolder, int, int, int) of type GameView must override a superclass method Andro11Activity.java /andro11/src/andro11/ejem line 41 Java Problem
    The method surfaceCreated(SurfaceHolder) of type GameView must override a superclass method Andro11Activity.java /andro11/src/andro11/ejem line 47 Java Problem
    The method surfaceDestroyed(SurfaceHolder) of type GameView must override a superclass method Andro11Activity.java /andro11/src/andro11/ejem line 54 Java Problem
    The public type GameView must be defined in its own file Andro11Activity.java /andro11/src/andro11/ejem line 28 Java Problem

    me interesa saber que falla,

    gracias

      • dan5sanf
      • 12/12/11

      Entube revisando el error y desconozco el origen y el motivo, está fuera de mis conocimientos, el ejemplo fue probado varias veces.

    • David
    • 2/02/12

    Estupendo el manual de gráficos en android. :)

    David.

  1. Aún no hay trackbacks

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.