使用LinearLayout的自定义小部件无法获取onDraw()方法

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()方法?


2
不要使用Canvas的宽度和高度,它们不是你想要的。 - Romain Guy
1个回答

125

在你的构造函数中,需要调用 setWillNotDraw(false)

默认情况下,布局不需要进行绘制,因此一种优化方法是不调用其绘制方法。通过调用 setWillNotDraw(false),您告诉UI工具包要进行绘制。


哈!原来需要设置一个标记(flag)!谢谢 :-) - Steve Pomeroy
3
@ Romain Guy,您能解释一下为什么需要添加 setWillNotDraw(false) 吗?谢谢! - Judy
22
默认情况下,布局不需要绘制,因此一种优化方式是不调用其绘制方法。通过调用setWillNotDraw(false),您告诉UI工具包要进行绘制。 - Romain Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接