🔺
FlutterのCustomPaintで図形を描いて遊ぶ
はじめに
Flutterでアプリを作っていると、独自な描画をしたくなることがあります。
こうした時は、CustomPaint
を使うと、自由に図形を描画することができます。
CustomPaint
は次の手順で簡単に使うことができます。
-
CustomPaint
をウィジェットツリーに追加 -
CustomPaint
にsize
、painter
を与える -
painter
を実装(CustomPainter
を拡張して作る) -
CustomPainter
にpaint()
、shouldRepaint()
を実装する
paint()
では次のような関数を使い、canvas
上に自由に描画できます。
- 線を描画する
drawLine()
- 長方形を描画する
drawRect()
- 円を描画する
drawCircle()
- アーチを描画する
drawArc()
- パスを描画する
drawPath()
- ビットマップ画像を描画する
drawImage()
- テキストを描画する
drawParagraph()
ここでは実際にいくつかCustomPaint
を使って図形を書いてみます。
円
次のコードでシンプルな円を描くことができます。
import 'dart:math';
import 'package:flutter/material.dart';
class PaintTestPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CustomPaint(
size: const Size(100, 100),
painter: CirclePaint(),
),
),
);
}
}
class CirclePaint extends CustomPainter {
void paint(Canvas canvas, Size size) {
print('Size(${size.width},${size.height})');// Size(100,100)
final paint = Paint()..color = Colors.red;
final center = Offset(size.width / 2, size.height / 2);
final radius = min(size.width, size.height);
canvas.drawCircle(center, radius, paint);
}
// 再描画する必要なし
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}
paint()
のstyle
でPaintingStyle.stroke
を指定すれば、次のように塗りつぶしでなく、線を引くことができます。
...
final paint = Paint()
..color = Colors.red
..style = PaintingStyle.stroke
..strokeCap = StrokeCap.round
..strokeWidth = 12;
...
三角形
次は正三角形を書いてみましょう。
次のように、drawPath()
を使うことで、与えたパスに対し描画を行うことができます。
import 'dart:math';
import 'package:flutter/material.dart';
class PaintTestPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CustomPaint(
size: const Size(100, 100),
painter: TriPaint(),
),
),
);
}
}
class TriPaint extends CustomPainter {
void paint(Canvas canvas, Size size) {
final path = Path()
..moveTo(
0,
size.height,
)
..lineTo(
size.width / 2,
size.height - size.width / 2 * sqrt(3),
)
..lineTo(
size.width,
size.height,
)
..lineTo(
0,
size.height,
);
final paint = Paint()
..color = Colors.blue
..style = PaintingStyle.stroke
..strokeWidth = 2;
canvas.drawPath(path, paint);
}
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}
参考文献
CustomPaint class - widgets library - Dart API
Paths in Flutter: A Visual Guide. Flutter gives us a lot of standard… | by Muhammed Salih Guler | Flutter Community | Medium
How to Paint in Flutter. A simple guide for learning to use the… | by Suragch | Medium
Discussion