Widget personalizado usando LinearLayout no obteniendo onDraw()


Estoy creando un widget personalizado extendiendo LinearLayout:

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 agregar niños muy bien, pero nunca me llaman a mi onDraw() personalizado. dispatchDraw() se llama, pero eso parece tener un lienzo diferente (el que está dentro del relleno. Necesito dibujar en toda el área de diseño). ¿Hay alguna bandera que deba configurarse para que se llame onDraw() para el diseño?

Author: Steve Pomeroy, 2010-08-14

1 answers

Necesitas llamar a setWillNotDraw(false) en tu constructor.

Porque de forma predeterminada un diseño no necesita dibujar, por lo que una optimización es no llamar al método de dibujo. Al llamar a setWillNotDraw(false) le dices al kit de herramientas de interfaz de usuario que quieres dibujar.

 111
Author: Romain Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-30 15:48:24