2010-08-13 19 views
41

Estoy creando un widget personalizado mediante la extensión de LinearLayout:widget personalizado utilizando LinearLayout no conseguir onDraw()

public class MyWidget extends LinearLayout { 
    private static Paint PAINT = new Paint(Paint.ANTI_ALIAS_FLAG); 
    static { 
     PAINT.setColor(Color.RED); 
    } 

    public MyWidget(Context context) { 
     this(context, null); 
    } 

    public MyWidget(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, canvas.getWidth()/2, PAINT); 
     // never gets called :-(
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 
     // this gets called, but with a canvas sized after the padding. 
    } 
} 

puedo añadir los niños muy bien, pero nunca recibo mi costumbre onDraw() que se llama. dispatchDraw() se llama, pero parece tener un lienzo diferente (el que está dentro del relleno. Necesito dibujar en toda el área de diseño). ¿Hay algún indicador que deba establecerse para obtener onDraw() llamado para el diseño?

+2

No utilice el ancho y la altura del lienzo, no son lo que desea. –

Respuesta

107

Debe llamar al setWillNotDraw(false) en su constructor.

Porque, de forma predeterminada, un diseño no necesita dibujar, por lo que una optimización es no llamar es el método de dibujo. Al llamar al setWillNotDraw(false), le dice al conjunto de herramientas de UI que desea dibujar.

+0

¡Ja! ¡Entonces había una bandera que debía establecerse! Gracias :-) –

+3

@ Romain Guy, ¿Puedes explicar por qué necesitas agregar 'setWillNotDraw (false)'. ¡Gracias! – Judy

+20

Porque, de forma predeterminada, un diseño no necesita dibujar, por lo que una optimización es no llamar es el método de dibujo. Al llamar a setWillNotDraw (falso) le dice al conjunto de herramientas de UI que desea dibujar. –

Cuestiones relacionadas