Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Canvas does not draw in Custom View

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.
like image 779
iTurki Avatar asked Sep 04 '12 10:09

iTurki


People also ask

Does canvas use OpenGL?

Actually, after Android 4.0 the Canvas at android. view. View is a hardware accelerated canvas, which means it is implementd by OpenGL, so you do not need to use another way for performance.

What is the use of canvas view?

Canvas has a method to draw a rectangle, while Paint defines whether to fill that rectangle with a color or leave it empty. Simply put, Canvas defines shapes that you can draw on the screen, while Paint defines the color, style, font, and so forth of each shape you draw.


1 Answers

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.

like image 199
Aitor Calderon Avatar answered Oct 21 '22 10:10

Aitor Calderon