PDA

Ver la Versión Completa : Dibujar rectangulos en un View


ico87
07/03/13, 20:36:19
Buenas

Me parece algo demasiado sencillo, pero no consigo hacerlo, tengo un pequeño imageView (podria usar cualquier otra componente) en la que según ciertas operaciones tengo que dibujar un rectangulo de uno u otro tamaño y en una posición distinta. Pero no consigo encontrar por internet a pesar de lo basico que me parece, un ejemplo que me saque de la duda, alguien me puede poner alguno.

Saludos

mocelet
07/03/13, 20:46:47
Mira aquí mismo: http://www.sgoliver.net/blog/?p=1655

La clave es redefinir el método onDraw(Canvas canvas) de la clase, y con el canvas pintas lo que quieras.

ico87
07/03/13, 20:54:22
Y como puedo redefinir el método onDraw de un componente que instancio de la forma:

priva ImageView imageViewRectangle = (ImageView) findViewById(R.id.ImageViewRectangle);

Gracias por contestar!

mocelet
07/03/13, 21:10:50
Tienes que crear una clase derivada de View (o de TextView o de ImageView o de la que quieras, y así te ahorras código para calcular el tamaño).

En el XML tienes que indicar el nombre completo de la clase, p.ej. com.pepito.RectangleView

Y en el código Java en vez de manejar ImageView o View, como es un control personalizado y querrás controlarlo, usas directamente tu clase personalizada.

EDITO: En la misma web lo explican mejor en un capítulo anterior: http://www.sgoliver.net/blog/?p=1457

ico87
07/03/13, 22:12:21
ok, muchas gracias, me pilla ya un poco tarde, pero lo leo mañana con detenimiento!!

ico87
09/03/13, 18:18:23
Pues muchas gracias mocelet, ya lo he hecho asi y me inicializa el rectangulo perfecto:

public void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, p1);
}

pero ahora quiero que cuando hace la aplicacion ciertos calculos, ese rectangulo varie. ¿Como puedo hacer esto? He probado haciendo en la clase un metodo como este:

public void drawRect(float left, float top, float right, float bottom){
Canvas canvas = new Canvas();
super.onDraw(canvas);
canvas.drawRect(left, top, right, bottom, p1);
}

y desde la interfaz lo llamo cuando tiene que cambiar, pero el rectangulo no cambia...

kriogeN
09/03/13, 20:05:26
El código del onDraw está mal.

Funcionar funciona, pero siempre irás con 1 frame de retraso. Además de que deberías limpiar el Canvas antes de pintarlo, sobre todo si tu intención es moverlo.

El código debería ser:

public void onDraw(Canvas canvas){
canvas.drawColor(Color.BLACK);
canvas.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1, p1);
super.onDraw(canvas);
}

En cuanto a la segunda parte, no puedes llamar al onDraw cuando te de la gana, sólo si usas un SurfaceView. Lo que si que puedes hacer es hacer globales las variables left, top, right y bottom (o mejor aún, el Rect en si) y pintarlo usando las variables. Lo que necesitarás después es "setear" al Rect o a las posiciones.

public void onDraw(Canvas canvas){
canvas.drawColor(Color.BLACK);
canvas.drawRect(left, top, right, bottom, p1);
super.onDraw(canvas);
}

public void setRect(float left, float top, float right, float bottom)
{
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}

ico87
19/03/13, 20:38:24
Perdonad el retraso, que ando de curro hasta las cejas. Me ha funcionado perfectamente. Muchas gracias.