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

我正在通过扩展LinearLayout创build一个自定义小部件:

 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()被调用,但似乎有一个不同的canvas(填充内的canvas,我需要在整个布局区域绘制)。 是否有一些标志需要设置得到onDraw()调用布局?

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

因为默认情况下一个布局不需要绘制,所以一个优化就是不要调用draw方法。 通过调用setWillNotDraw(false)您可以告诉UI工具包要绘制。