2010-08-13 10 views
41

ich ein eigenes Widget Erstellen LinearLayout durch die Erweiterung:Benutzerdefinierte Widget mit Linearlayout nicht immer 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. 
    } 
} 

ich Kinder ganz gut hinzufügen kann, aber ich bin nie meine Gewohnheit immer onDraw() genannt zu werden. dispatchDraw() wird aufgerufen, aber das scheint eine andere Leinwand zu haben (die, die innerhalb der Polsterung ist. Ich muss auf den gesamten Layoutbereich zeichnen). Gibt es ein Flag, das gesetzt werden muss, um das Layout onDraw() zu erhalten?

+2

Verwenden Sie nicht die Breite und Höhe des Canvas, sie sind nicht was Sie wollen. –

Antwort

107

Sie müssen setWillNotDraw(false) in Ihrem Konstruktor aufrufen.

Da standardmäßig ein Layout nicht zeichnen muss, so ist eine Optimierung nicht aufrufen ist Draw-Methode. Indem Sie setWillNotDraw(false) aufrufen, teilen Sie dem UI-Toolkit mit, dass Sie zeichnen möchten.

+0

Ha! Da war also eine Flagge, die gesetzt werden musste! Danke :-) –

+3

@ Romain Guy, Können Sie erklären, warum müssen 'setWillNotDraw (false)' 'hinzufügen. Vielen Dank! – Judy

+20

Da ein Layout standardmäßig nicht gezeichnet werden muss, ist eine Optimierung nicht das Zeichnen der Methode. Durch Aufrufen von setWillNotDraw (false) teilen Sie dem UI-Toolkit mit, dass Sie zeichnen möchten. –