Pregunta

Estoy creando un widget personalizado por LinearLayout extendiéndose:

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 onDraw() a medida que se llama. dispatchDraw() se llama, pero que parece tener un lienzo diferente (la que está dentro del relleno. Tengo que recurrir a toda el área de diseño). ¿Hay algún indicador de que las necesidades para ponerse en conseguir onDraw() llamada para el diseño?

¿Fue útil?

Solución

Es necesario llamar setWillNotDraw(false) en su constructor.

Debido a que por defecto un diseño no necesita dibujar, por lo que una optimización es no llamada es dibujar método. Llamando setWillNotDraw(false) le dice al kit de herramientas de interfaz de usuario que desea dibujar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top