- 전체
- 게임 일반 (make game basics)
- 모바일 기획 및 디자인
- GameMaker Studio
- Unity3D
- Cocos2D
- 3D Engine OGRE
- 3D Engine irrlicht
- copperCube
- corona SDK
- Windows Basic Game
- BaaS (Mobile Backend)
- phnegap & cordova
- ionic & anguler
- parse (backend)
- firebase (backend)
- Game Backend Server / Opt
- web assembly
- Smart Makers
- pyGame & Ren'Py
- 머드(MUD) 게임 만들기
- Xamarin(자마린)
- flutter (플루터 앱 개발)
- construct 2 / 3
- pocketbase
- RPG Maker 시리즈
- godot engine
- playmaker(unity)
- react native
flutter (플루터 앱 개발) [flutter (플루터 앱 개발)] Flutter Canvas 그리기 예제 - (5) 드래그로 Canvas 이동시키기
2025.01.18 20:04
[flutter (플루터 앱 개발)] Flutter Canvas 그리기 예제 - (5) 드래그로 Canvas 이동시키기

Flutter Canvas 드래그로 이동시키기
Flutter Canvas에서 드래그로 화면을 이동시키는 기능은 GestureDetector와 CustomPainter를 활용하여 구현할 수 있습니다. 이 포스팅에서는 Canvas를 드래그해 이동시키는 방법을 코드와 함께 자세히 설명합니다.
1. 기본 아이디어
- 사용자가 드래그를 시작하면 초기 터치 좌표를 저장합니다.
- 드래그를 업데이트할 때마다 이전 좌표와 현재 좌표의 차이를 계산하여 Canvas의 이동량(offset)을 갱신합니다.
- CustomPainter를 사용하여 Canvas의 내용을 그릴 때 이동된 위치를 반영합니다.
2. 주요 코드
GestureDetector를 활용한 드래그 이벤트 처리
3. Canvas에 이동 반영
CustomPainter의 paint 메서드에서 canvas.translate를 사용하여 이동량을 반영합니다.
class DraggablePainter extends CustomPainter {
final double offsetX;
final double offsetY;
DraggablePainter(this.offsetX, this.offsetY);
@override
void paint(Canvas canvas, Size size) {
canvas.save();
canvas.translate(offsetX, offsetY);
// 배경 그리기
_drawBackground(canvas, size);
// 그리드 그리기
_drawGrid(canvas, size);
canvas.restore();
}
void _drawBackground(Canvas canvas, Size size) {
final paint = Paint()..color = Colors.white70;
canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), paint);
}
void _drawGrid(Canvas canvas, Size size) {
final paint = Paint()..color = Colors.grey;
const double gridSize = 50.0;
for (double x = 0; x < size.width; x += gridSize) {
canvas.drawLine(Offset(x, 0), Offset(x, size.height), paint);
}
for (double y = 0; y < size.height; y += gridSize) {
canvas.drawLine(Offset(0, y), Offset(size.width, y), paint);
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
4. 결과
GestureDetector를 사용하여 드래그 이벤트를 처리하고, Canvas의 오프셋(offset)을 업데이트합니다.- Canvas를 이동시킬 때 그리드와 기타 요소들도 함께 이동합니다.
CustomPainter를 활용하여 Canvas를 갱신합니다.
코드 전체
import 'package:flutter/material.dart';
class DraggableObjectPage extends StatefulWidget {
@override
State<DraggableObjectPage> createState() => _DraggableObjectPageState();
}
class _DraggableObjectPageState extends State<DraggableObjectPage> {
double offsetX = 0.0;
double offsetY = 0.0;
double preX = 0.0;
double preY = 0.0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onPanDown: (details) {
preX = details.localPosition.dx;
preY = details.localPosition.dy;
},
onPanUpdate: (details) {
setState(() {
offsetX += details.localPosition.dx - preX;
offsetY += details.localPosition.dy - preY;
preX = details.localPosition.dx;
preY = details.localPosition.dy;
});
},
child: CustomPaint(
size: Size.infinite,
painter: DraggablePainter(offsetX, offsetY),
),
),
);
}
}
class DraggablePainter extends CustomPainter {
final double offsetX;
final double offsetY;
DraggablePainter(this.offsetX, this.offsetY);
@override
void paint(Canvas canvas, Size size) {
canvas.save();
canvas.translate(offsetX, offsetY);
final backgroundPaint = Paint()..color = Colors.white70;
canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), backgroundPaint);
final gridPaint = Paint()..color = Colors.grey;
const double gridSize = 50.0;
for (double x = 0; x < size.width; x += gridSize) {
canvas.drawLine(Offset(x, 0), Offset(x, size.height), gridPaint);
}
for (double y = 0; y < size.height; y += gridSize) {
canvas.drawLine(Offset(0, y), Offset(size.width, y), gridPaint);
}
canvas.restore();
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
결론
Flutter Canvas에서 드래그로 이동시키는 기능은 간단한 로직으로 구현할 수 있습니다. 이 방법을 사용하면 사용자가 직관적으로 Canvas를 제어할 수 있는 유용한 인터페이스를 만들 수 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 9 |
[Ren'py] 렌파이로 육성 시뮬레이션 게임 만들기 (4) DSE 를 이용해 이벤트 만들기 (2) : 미연시 만들기
| 졸리운_곰 | 2025.02.21 | 237 |
| 8 |
[Ren'py] 렌파이로 육성 시뮬레이션 게임 만들기 (3) DSE 를 이용해 이벤트 만들기 (1)
| 졸리운_곰 | 2025.02.18 | 203 |
| 7 |
[Ren'py] 렌파이로 육성 시뮬레이션 게임 만들기 (2) 스크린 언어로 스케쥴 화면 만들기
| 졸리운_곰 | 2025.02.17 | 290 |
| 6 |
[ren'py] 렌파이로 육성 시뮬레이션 게임 만들기 (1) 기초 스크립트 작성
| 졸리운_곰 | 2025.02.17 | 508 |
| 5 |
[Ren'Py] 렌파이(RenPy) 에 광고 (애드몹) 붙이기
| 졸리운_곰 | 2024.12.20 | 225 |
| 4 |
[pyGame] python 게임(game)만들기 - 파이썬으로 게임 만들기 튜토리얼
| 졸리운_곰 | 2021.05.12 | 957 |
| 3 |
PyGame - 사용법(기본 실행 구조)
| 졸리운_곰 | 2021.01.03 | 1214 |
| 2 |
[Ren'py] [렌파이] 배포 준비 전 확인 사항
| 졸리운_곰 | 2020.12.19 | 606 |
| 1 |
[python] [ pyGame] 컴퓨터그래픽스 : 그래픽 프리미티브 그리기
| 졸리운_곰 | 2020.08.09 | 397 |

