2010-08-13 21 views
41

Ben LinearLayout uzatarak özel bir widget oluşturma:Özel Araç onDraw'u almıyorum()

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. 
    } 
} 

Ben sadece iyi çocuklara ekleyebilir, ama asla benim özel onDraw() çağrıldığını alıyorum. dispatchDraw() çağrılıyor, ama bu farklı bir tuval var gibi görünüyor (dolgu içinde olan. Tüm düzen alanı üzerinde çizmek gerekir). Düzen için onDraw() almak için ayarlanması gereken bazı bayrak var mı?

+2

Tuval 'genişliğini ve yüksekliğini kullanmayın, istediğiniz gibi değiller. –

cevap

107

Yapıcınız için setWillNotDraw(false) numaralı telefonu aramanız gerekir.

Varsayılan olarak, bir düzenin çizim yapması gerekmediğinden, en iyi duruma getirme yönteminin çağrılması yöntemidir. setWillNotDraw(false) numaralı telefonu arayarak çizmek istediğiniz UI araç setini anlatırsınız.

+0

Ha! Yani ayarlanması gereken bir bayrak vardı! Teşekkürler :-) –

+3

@ Romain Guy, Neden 'setWillNotDraw (false)' eklemek gerektiğini açıklayabilir misiniz. Teşekkür ederim! – Judy

+20

Varsayılan olarak, bir düzenin çizim yapmasına gerek olmadığı için, optimizasyon aramaktan kaçınmaktır. SetWillNotDraw (false) çağrılarak, çizmek istediğiniz UI araç setini anlatırsınız. –