Frage

Ich bin ein benutzerdefiniertes Widget durch die Erweiterung LinearLayout erstellen:

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

kann ich Kinder hinzufügen, ganz gut, aber ich bin nie meine Gewohnheit onDraw() immer genannt wird. dispatchDraw() wird aufgerufen, aber das scheint eine andere Leinwand zu haben (die, die innerhalb der Polsterung ist. Ich muss auf die gesamte Layoutfläche ziehen). Gibt es eine Flagge, dass Bedürfnisse erhalten auf onDraw() für das Layout genannt zu bekommen?

War es hilfreich?

Lösung

Sie müssen setWillNotDraw(false) in Ihrem Konstruktor aufzurufen.

Da standardmäßig ein Layout nicht zu ziehen braucht, so eine Optimierung nicht Anruf ist Methode zeichnen. Durch den Aufruf setWillNotDraw(false) sagen Sie dem UI-Toolkit, das Sie zeichnen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top