Flutter Canvas 그리기 예제 - (2) Grid 격자 그리기
28 Dec 2021 | Flutter10x10 Grid 격자 그리기
10x10의 격자를 그리는 샘플 코드입니다.

import 'package:flutter/material.dart';
class GridPage extends StatelessWidget {
const GridPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
child: Container(),
painter: GridPainter(),
),
);
}
}
class GridPainter extends CustomPainter {
static const rows = 10;
static const cols = 10;
@override
void paint(Canvas canvas, Size size) {
var backgroundPaint = Paint()
..style = PaintingStyle.fill
..color = Colors.lime
..isAntiAlias = true;
final screenWidth = size.width;
final screenHeight = size.height;
Rect rect = Rect.fromLTWH(0, 0, screenWidth, screenHeight);
canvas.drawRect(rect, backgroundPaint);
var linePaint = Paint()
..style = PaintingStyle.fill
..color = Colors.black38
..isAntiAlias = true;
final gridWidth = size.width / cols;
final gridHeight = size.height / rows;
for (int row = 0; row < rows; row++) {
final y = row * gridHeight;
final p1 = Offset(0, y);
final p2 = Offset(screenWidth, y);
canvas.drawLine(p1, p2, linePaint);
}
for (int col = 0; col < cols; col++) {
final x = col * gridWidth;
final p1 = Offset(x, 0);
final p2 = Offset(x, screenHeight);
canvas.drawLine(p1, p2, linePaint);
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => false;
}
고정 간격의 Grid 그리기
화면의 크기가 변경되더라도 Grid 격자의 크기는 고정인 Canvas 예제입니다.
import 'package:flutter/material.dart';
class GridPage extends StatelessWidget {
const GridPage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomPaint(
child: Container(),
painter: GridPainter(),
),
);
}
}
class GridPainter extends CustomPainter {
static const gridWidth = 50.0;
static const gridHeight = 50.0;
var _width = 0.0;
var _height = 0.0;
void _drawBackground(Canvas canvas) {
var paint = Paint()
..style = PaintingStyle.fill
..color = Colors.lime
..isAntiAlias = true;
Rect rect = Rect.fromLTWH(0, 0, _width, _height);
canvas.drawRect(rect, paint);
}
void _drawGrid(Canvas canvas) {
var paint = Paint()
..style = PaintingStyle.fill
..color = Colors.black38
..isAntiAlias = true;
final rows = _height / gridHeight;
final cols = _width / gridWidth;
for (int r = 0; r < rows; r++) {
final y = r * gridHeight;
final p1 = Offset(0, y);
final p2 = Offset(_width, y);
canvas.drawLine(p1, p2, paint);
}
for (int c = 0; c < cols; c++) {
final x = c * gridWidth;
final p1 = Offset(x, 0);
final p2 = Offset(x, _height);
canvas.drawLine(p1, p2, paint);
}
}
@override
void paint(Canvas canvas, Size size) {
_width = size.width;
_height = size.height;
_drawBackground(canvas);
_drawGrid(canvas);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => false;
}