Flutter Canvas Draw Circle

Introduction

With Google’s robust UI toolkit Flutter, developers can create natively compiled desktop, web, and mobile applications from a single codebase. Using the Canvas class to create bespoke paintings is one of Flutter’s most flexible features. With the Canvas, developers may produce more intricate images, forms, and animations than they could with Flutter’s default widgets. Among these skills, the ability to draw a circle is a key one that forms the foundation of many more intricate patterns.

In this blog, we’ll explore how to draw a circle using Flutter’s Canvas class. We’ll cover everything from the basics of setting up a custom painter to drawing and customizing circles with various styles, sizes, and colors. By the end of this guide, you’ll have a deep understanding of how to use Flutter’s Canvas to draw circles and other shapes, giving you the tools to create stunning custom UI components.

Understanding the Flutter Canvas

The Canvas in Flutter is a powerful class that allows for drawing operations like lines, shapes, text, and images. It’s part of Flutter’s dart:ui library, which is where low-level painting and layout operations are handled. The Canvas works closely with the CustomPainter class, which provides the framework for painting on the screen.

Setting Up a Custom Painter

To start drawing on a Canvas, you need to set up a CustomPainter. This involves creating a new class that extends CustomPainter and overriding two key methods: paint and shouldRepaint.

  • paint: This method is where the drawing logic is implemented. The Canvas object is passed to this method, allowing you to perform various drawing operations.
  • shouldRepaint: This method returns a boolean indicating whether the painter should repaint the widget. It’s used to optimize performance by avoiding unnecessary repaints.

Here’s a simple example of setting up a CustomPainter to draw a circle:

import 'package:flutter/material.dart';

class CirclePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;

    final center = Offset(size.width / 2, size.height / 2);
    final radius = 100.0;

    canvas.drawCircle(center, radius, paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}

Drawing a Simple Circle

In the example above, we created a CirclePainter class that draws a simple blue circle. Let’s break down the key components:

  • Paint: The Paint object defines how the circle will be drawn, including its color, style, stroke width, and more. In this case, we set the color to blue and the style to PaintingStyle.fill, which means the circle will be filled with the specified color.
  • Offset: The Offset class represents a point in a two-dimensional space. We use it to define the center of the circle, which is calculated as the midpoint of the Canvas size.
  • drawCircle: This method draws a circle on the Canvas. It takes three parameters: the center of the circle, the radius, and the Paint object.

To display this circle in your Flutter app, use the CustomPaint widget:

class CirclePainterApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Canvas Circle'),
      ),
      body: Center(
        child: CustomPaint(
          size: Size(200, 200),
          painter: CirclePainter(),
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: CirclePainterApp(),
));

Customizing the Circle

Drawing a simple circle is just the beginning. Flutter’s Canvas provides a wealth of options for customizing how the circle is drawn. Let’s explore some of these options.

1. Changing the Circle’s Color

The color of the circle can be easily changed by modifying the color property of the Paint object. Here’s how to draw a red circle instead of a blue one:

final paint = Paint()
  ..color = Colors.red
  ..style = PaintingStyle.fill;

2. Drawing a Stroked Circle

If you want to draw a circle with an outline rather than a filled shape, change the style property to PaintingStyle.stroke and set a strokeWidth:

final paint = Paint()
  ..color = Colors.green
  ..style = PaintingStyle.stroke
  ..strokeWidth = 5.0;

This will create a circle with a green outline that is 5 pixels thick.

3. Adjusting the Circle’s Radius

The radius of the circle can be easily adjusted by changing the radius parameter in the drawCircle method. For example, to draw a larger circle:

final radius = 150.0;

4. Applying Gradients

Flutter also allows you to apply gradients to the circle, giving it a more dynamic look. To do this, create a Shader and apply it to the Paint object:

final Rect rect = Rect.fromCircle(center: center, radius: radius);
final Gradient gradient = RadialGradient(
  colors: [Colors.blue, Colors.green],
);

final paint = Paint()
  ..shader = gradient.createShader(rect);

This will create a circle that transitions from blue to green in a radial gradient pattern.

Advanced Customizations

Now that we’ve covered the basics of drawing and customizing a circle, let’s explore some more advanced customizations that can make your UI stand out.

1. Drawing Multiple Circles

You can easily draw multiple circles by calling drawCircle multiple times with different parameters. Here’s an example of drawing three concentric circles:

class ConcentricCirclesPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.stroke
      ..strokeWidth = 3.0;

    final center = Offset(size.width / 2, size.height / 2);

    for (double radius = 50; radius <= 150; radius += 50) {
      canvas.drawCircle(center, radius, paint);
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}

This code will draw three circles with radii of 50, 100, and 150 pixels, all sharing the same center.

2. Animating the Circle

To add a dynamic touch to your UI, you can animate the circle’s properties, such as its radius, color, or position. Flutter’s animation framework makes this straightforward.

Here’s an example of animating the circle’s radius:

class AnimatedCirclePainter extends CustomPainter {
  final double radius;
  final Color color;

  AnimatedCirclePainter({required this.radius, required this.color});

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = color
      ..style = PaintingStyle.fill;

    final center = Offset(size.width / 2, size.height / 2);

    canvas.drawCircle(center, radius, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return true;
  }
}

To animate this painter, you would use a TweenAnimationBuilder:

class AnimatedCircleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Circle'),
      ),
      body: Center(
        child: TweenAnimationBuilder<double>(
          tween: Tween(begin: 0.0, end: 100.0),
          duration: Duration(seconds: 2),
          builder: (context, radius, child) {
            return CustomPaint(
              size: Size(200, 200),
              painter: AnimatedCirclePainter(
                radius: radius,
                color: Colors.purple,
              ),
            );
          },
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: AnimatedCircleApp(),
));

This example animates the circle’s radius from 0 to 100 pixels over two seconds.

Conclusion

Drawing circles with Flutter’s Canvas is a simple yet powerful way to create custom UI elements that stand out. Whether you’re drawing a basic circle or creating complex animations, the Canvas class provides the flexibility and control needed to bring your designs to life.

In this guide, we’ve covered the basics of setting up a CustomPainter, drawing circles with various customizations, and even animating your drawings. With these techniques, you can enhance your Flutter applications with custom graphics that make your UI unique and engaging.

Explore the possibilities by experimenting with different shapes, styles, and animations. The more you practice, the more creative and efficient you’ll become in utilizing Flutter’s powerful Canvas to create stunning visual effects.