sábado, 16 de agosto de 2014

Dibujar sobre Canvas en Android: El principio de los videojuegos

Cuando desarrollamos videojuegos escritos en Java, debemos olvidarnos de todos los FormWidgets que nos presenta la API de Android (TextViews, EditTexts, Buttons, etc.) y concentrarnos en cómo dibujar figuras e imágenes sobre la pantalla.

View Personalizada


Para poder dibujar sobre la pantalla, deberemos crear un tipo de dato que herede de View. De esta manera, podremos poner nuestra View como contenido de la Activity, en vez de un archivo xml de layout como se acostumbra al desarrollar aplicaciones.

Crearemos una clase llamada GameView y escribiremos un constructor que reciba el Context como argumento, ya que deberemos pasárselo al constructor de la clase superior.

public class GameView extends View
{
    public GameView(Context context) {
        super(context);
    }
}


Luego reemplazaremos la típica línea setContentView(R.layout.main) en nuestra Activity por lo siguiente:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GameView gameView = new GameView(this);
    setContentView(gameView);
}

De esta forma la Activity tendrá a nuestra View personalizada como contenido en pantalla.

Dibujando en nuestra View


Ahora que tenemos nuestra clase GameView, podremos reescribir el método “onDraw” el cual se ejecuta al re dibujarse la pantalla.

@Override
protected void onDraw(Canvas canvas) {

}

El método recibe como argumento un objeto del tipo Canvas, este objeto es sobre el cual se dibuja, es decir, que nos proveerá métodos para dibujar textos, imágenes, figuras geométricas, etc.

Dibujando un círculo en pantalla


Para dibujar un círculo, primero debemos crear un objeto del tipo Paint, en el cual se define el estilo con el que se dibujará (color de línea, color de fondo, ancho de línea, etc.) De modo que creamos un atributo Paint en nuestra clase y creamos un objeto en el constructor:

Paint paint;
public GameView(Context context) {
    super(context);
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.RED);
}

Ahora en nuestro método onDraw podemos indicarle al Canvas que dibuje un círculo aplicando como estilo el objeto Paint:

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawCircle(50, 50, 10, paint);
}


Los parámetros pasados al método drawCircle son x,y, el radio del circulo, y el objeto Paint respectivamente. Cabe destacar que las coordenadas y el radio tienen como unidad el pixel.

Dibujando texto en pantalla con un tipo de fuente personalizada


Para dibujar un texto, debemos utilizar el método drawText del objeto Canvas:

canvas.drawText("Laboratorio de", 60, 110, paint);
canvas.drawText("Software Libre", 50, 210, paint);

El tipo de fuente y el tamaño del texto, lo debemos setear en el objeto paint:

paint.setTypeface(Typeface.createFromAsset(context.getAssets(),
                                               "Snowtop.ttf"));
paint.setTextSize(48);

El archivo de fuente, debemos colocarlo en la carpeta assets: