52

私は拡張してカスタムウィジェットを作成しています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()レイアウトを呼び出すために設定する必要のあるフラグはありますか?

4

1 に答える 1

125

setWillNotDraw(false)コンストラクターを呼び出す必要があります。

デフォルトではレイアウトは描画する必要がないため、最適化では、drawメソッドを呼び出さないようにします。電話をかけるsetWillNotDraw(false)ことで、描画するUIツールキットを伝えます。

于 2010-08-13T21:55:09.930 に答える