Пользовательское использование Виджета LinearLayout, не добираясь onDraw ()

Я создаю пользовательский виджет путем расширения 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() требовавшийся расположение?

47
задан Steve Pomeroy 13 August 2010 в 21:25
поделиться

1 ответ

Вам нужно вызвать setWillNotDraw (false) в вашем конструктор.

Поскольку по умолчанию макет не нужно рисовать, оптимизация заключается в том, чтобы не вызывать метод рисования. Вызывая setWillNotDraw (false) , вы сообщаете инструментарию пользовательского интерфейса, что хотите рисовать.

117
ответ дан 26 November 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: