Canvas does not draw in Custom View

iTurki picture iTurki · Sep 4, 2012 · Viewed 15k times · Source

I created a Custom View CircleView like this:

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);  
    }
}

Then I included it on my Activity's layout root <RelativeLayout>:

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

However, nothing was drawn!

  • Am I implementing the Custom View right?
  • Or is it how I used the Custom View?

Some Info:

  • Both CircleView and MyActivity are in the same package: com.turkidroid.test.
  • In onDraw() method, I tried including super.onDraw() and commenting it.
  • I know I can draw a circle with much simpler approaches but my CircleView will contain more than drawing a circle. I need to make it a Custom View.

Answer

Aitor Calderon picture Aitor Calderon · Sep 4, 2012

Your onDraw method is never called, you need to call setWillNotDraw(false) on the constructor of your Custom View in order to get onDraw actually called.

As stated on Android SDK:

If this view doesn't do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGroup. Typically, if you override onDraw(android.graphics.Canvas) you should clear this flag.