android-使用LinearLayout的自定义小部件未获取onDraw()

我通过扩展onDraw()来创建自定义窗口小部件:

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个解决方案
116 votes

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

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

Romain Guy answered 2020-06-30T01:06:37Z
translate from https://stackoverflow.com:/questions/3480769/custom-widget-using-linearlayout-not-getting-ondraw