Android 画布不在自定义视图中绘制

Android 画布不在自定义视图中绘制,android,android-canvas,android-custom-view,Android,Android Canvas,Android Custom View,我创建了一个自定义视图CircleView,如下所示: public class CircleView extends LinearLayout { Paint paint1; public CircleView(Context context) { super(context); init(); } public CircleView(Context context, AttributeSet attrs) {

我创建了一个自定义视图CircleView,如下所示:

public class CircleView extends LinearLayout {

    Paint paint1;
    public CircleView(Context context) {
        super(context);
        init();
    }   
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public void init() {
        paint1 = new Paint();
        paint1.setColor(Color.RED); 
    }       
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);         
        canvas.drawCircle(50, 50, 25, paint1);
        this.draw(canvas);  
    }
}
然后我将其包含在活动的布局根目录中


然而,什么也没有画出来

  • 我是否实现了自定义视图
  • 还是我使用自定义视图的方式
一些信息:

  • CircleView和MyActivity都在同一个包中:
    com.turkidroid.test
  • onDraw()
    方法中,我尝试包括
    super.onDraw()
    并对其进行注释
  • 我知道我可以用更简单的方法画一个圆,但我的CircleView包含的不仅仅是画一个圆。我需要将其设置为自定义视图

您的onDraw方法从未被调用,您需要在自定义视图的构造函数上调用setWillNotDraw(false),以便实际调用onDraw

如Android SDK所述:

如果此视图本身不进行任何绘制,请将此标志设置为“允许” 进一步优化。默认情况下,此标志不在视图上设置,但 可以在某些视图子类(如ViewGroup)上设置。通常,如果 如果覆盖onDraw(android.graphics.Canvas),则应清除此选项 旗帜


你的
this.draw()方法在哪里

这应该起到决定性的作用:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);         
    canvas.drawCircle(50, 50, 25, paint1);
    //this.draw(canvas);  where is this method?
}

在我将方法添加到构造函数后,它抛出
java.lang.StackOverflowerError
!有什么想法吗?在我
从我的代码中删除super.onDraw()
后,你的建议很有魅力。谢谢我不确定它是什么,我的super.ondraw调用丢失了,上面的标志也被设置为默认值,但是在加入这两个魔术之后发生了^_^我想投更多的一票。。。这对于自定义视图来说是一个可怕的问题…
this.draw()
就是这个方法。还是不行!在我将
setWillNotDraw(false)
添加到构造函数之后,它确实工作了!我不知道为什么!如果需要自定义视图,则应始终从视图扩展,而不是从线性布局扩展,除非确实需要特定的行为。
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);         
    canvas.drawCircle(50, 50, 25, paint1);
    //this.draw(canvas);  where is this method?
}