Flutter Canvas Draw Circle

You can draw custom shapes, like rectangle, circle, line, etc., in your application.

In this tutorial, we shall learn how to draw a circle on a Canvas using CustomPainter widget.

Draw Circle Function – Canvas.drawCircle()

Following is the syntax of drawCircle() function in Flutter.

</>
Copy
void drawCircle(Offset c, double radius, Paint paint)

A quick example of drawCircle() is given below.

</>
Copy
void drawCircle(Offset(200, 200), 50, Paint())

Of course you can change the offset and radius of circle and paint properties.

Example – Flutter Canvas – Draw Circle

To draw a circle in our Flutter Application, we shall follow the below steps.

Step 1: Create a class that extends CustomPainter. This is our widget that has canvas and allows user to paint on to the canvas.

</>
Copy
class OpenPainter extends CustomPainter {
    ...
}

Step 2: Override paint() and shouldRepaint() methods of the CustomPainter class. In the paint() method, we have access to canvas and size of the canvas.

Step 3: Draw a circle on the canvas using canvas.drawCircle() method. You write this statement in paint() method of the class we created.

</>
Copy
@override
void paint(Canvas canvas, Size size) {
  //...  
  canvas.drawCircle(Offset(200, 200), 100, Paint());
}

Complete example program is

main.dart

</>
Copy
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter TutorialKart',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter - www.tutorialkart.com'),
      ),
      body: ListView(children: <Widget>[
        Container(
          width: 400,
          height: 400,
          child: CustomPaint(
            painter: OpenPainter(),
          ),
        ),
      ]),
    );
  }
}

class OpenPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint1 = Paint()
      ..color = Color(0xffaa44aa)
      ..style = PaintingStyle.fill;
    canvas.drawCircle(Offset(200, 200), 100, paint1);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

Run the application in your Android Device or Android Emulator.

Flutter Canvas - Draw Circle

Example – Flutter Canvas – Update Circle

You can update any property of the circle you would like to change in runtime.

In the following example application, we are changing the color and radius of the circle.

To change a property of the circle you are painting, follow these steps.

Step 1: Declare all the properties you would like to change, as variables. Assign the default or initial value to these variables.

</>
Copy
Color circleColor1 = Color(0xff000000);
double circleRadius1 = 100;

Step 2: Use this variables while you are painting the circle in CustomPainter class.

</>
Copy
var paint1 = Paint()
  ..color = circleColor1
  ..style = PaintingStyle.fill;
canvas.drawCircle(Offset(150, 150), circleRadius1, paint1);

Step 3: When a change has to be made, like when user presses a button, assign the new value for property using the variable(declared in step 1).

</>
Copy
circleColor1 = Color(0xff885599);
circleRadius1 = 80;

The complete program is

main.dart

</>
Copy
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

Color circleColor1 = Color(0xff000000);
double circleRadius1 = 100;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter TutorialKart',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter - www.tutorialkart.com'),
      ),
      body: ListView(children: <Widget>[
        Text(
          'My Canvas',
          textAlign: TextAlign.center,
          style: TextStyle(fontSize: 20),
        ),
        Container(
          width: 400,
          height: 400,
          child: CustomPaint(
            painter: OpenPainter(),
          ),
        ),
        RaisedButton(
          child: Text('Repaint Canvas'),
          onPressed: (){
            setState(() {
              circleColor1 = Color(0xff885599);
              circleRadius1 = 80;
            });
          },
        ),
      ]),
    );
  }
}

class OpenPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    var paint1 = Paint()
      ..color = circleColor1
      ..style = PaintingStyle.fill;
    canvas.drawCircle(Offset(150, 150), circleRadius1, paint1);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => true;
}

Run the application in your Android Smartphone or Emulator, you will get the left screen as shown in the following screenshot. When you press the Repaint Canvas button, the color the circle and the radius change to a new value.

Flutter Canvas - Draw Circle - Update Circle Properties

Conclusion

In this Flutter Tutorial, we learned how to draw a circle on a Canvas using CustomPainter class.