2010-08-13 22 views
41

tôi là tạo ra một widget tùy chỉnh bằng cách mở rộng LinearLayout:Tuỳ chỉnh Widget sử dụng LinearLayout không nhận 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. 
    } 
} 

tôi có thể thêm trẻ em tốt, nhưng tôi không bao giờ nhận được tùy chỉnh của tôi onDraw() được gọi. dispatchDraw() được gọi, nhưng điều đó dường như có một khung hình khác nhau (một trong đó là trong padding. Tôi cần phải vẽ trên toàn bộ khu vực bố trí). Có một số cờ cần được đặt để có được onDraw() được gọi cho bố cục không?

+2

Không sử dụng chiều rộng và chiều cao của Canvas, chúng không phải là thứ bạn muốn. –

Trả lời

107

Bạn cần gọi số setWillNotDraw(false) trong hàm tạo của mình.

Bởi vì theo mặc định bố cục không cần vẽ, do đó, tối ưu hóa không gọi là phương thức vẽ. Bằng cách gọi số setWillNotDraw(false), bạn cho bộ công cụ giao diện người dùng mà bạn muốn vẽ.

+0

Ha! Vì vậy, có một lá cờ cần thiết để được thiết lập! Cảm ơn :-) –

+3

@ Romain Guy, Bạn có thể giải thích lý do tại sao cần thêm 'setWillNotDraw (false)'. Cảm ơn bạn! – Judy

+20

Bởi vì theo mặc định, bố cục không cần vẽ, do đó, tối ưu hóa không gọi là phương thức vẽ. Bằng cách gọi setWillNotDraw (false) bạn nói với bộ công cụ giao diện người dùng mà bạn muốn vẽ. –