Я создаю пользовательский виджет путем расширения 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.
}
}
Я могу добавить детей очень хорошо, но я никогда не получаю свое пользовательское onDraw()
быть названным. dispatchDraw()
назван, но это, кажется, имеет другой холст (тот, который это в рамках дополнения. Я должен привлечь целую область расположения). Есть ли некоторый флаг, который должен быть установлен добраться onDraw()
требовавшийся расположение?
Вам нужно вызвать setWillNotDraw (false)
в вашем конструктор.
Поскольку по умолчанию макет не нужно рисовать, оптимизация заключается в том, чтобы не вызывать метод рисования. Вызывая setWillNotDraw (false)
, вы сообщаете инструментарию пользовательского интерфейса, что хотите рисовать.