Пользовательский виджет с использованием LinearLayout не получает onDraw () - PullRequest
46 голосов
/ 14 августа 2010

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

1 Ответ

115 голосов
/ 14 августа 2010

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

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

...