画布无法在自定义视图中绘制

15

我创建了一个类似于这样的自定义视图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);  
    }
}

然后我将它包含在我的 Activity 的布局根节点 <RelativeLayout> 中:

  <com.turkidroid.test.CircleView
      android:id="@+id/circle_view"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" 
      android:layout_centerInParent="true"  />  

然而,没有任何东西被绘制出来!

  • 我是否正确地实现了自定义视图?
  • 还是我使用自定义视图的方式有问题?

一些信息:

  • CircleView和MyActivity都在同一个包中: com.turkidroid.test
  • onDraw()方法中,我尝试包含super.onDraw()并注释掉它。
  • 我知道可以用更简单的方法画一个圆形,但我的CircleView将会包含不仅仅是画圆。我需要将它变成一个自定义视图。
2个回答

30

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

根据Android SDK的说明:

如果此视图不会自己进行任何绘制,请设置此标志以允许进一步优化。默认情况下,View上没有设置此标志,但是某些View子类(例如ViewGroup)可能已设置此标志。通常,如果您重写onDraw(android.graphics.Canvas),则应清除此标志。


在我将该方法添加到构造函数后,它会抛出java.lang.StackOverflowError异常!有什么想法吗? - iTurki
在我的代码中取消注释super.onDraw()后,您的建议非常有效。谢谢! - iTurki
我不确定是什么问题,我的super.ondraw调用丢失了,并且上面的标志也被设置为默认值,但是在加入这两个后,魔法发生了!! ^_^ - Dheeraj Bhaskar
我希望能够给予不止一次的点赞...这对于自定义视图来说是一个很糟糕的问题... - TacB0sS

0

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

这应该绝对有效:

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

this.draw()View.draw() 方法。还是不行! - iTurki
在构造函数中添加 setWillNotDraw(false) 后,它确实起作用了!我不知道为什么! - iTurki
2
如果您需要自定义视图,除非您确实需要特定的行为,否则应始终从View而不是LinearLayout进行扩展。 - WarrenFaith

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