Flutter에서 물리 효과를 활용한 애니메이션은 현실적인 움직임과 자연스러운 사용자 경험을 제공합니다.
이 글에서는 물리 법칙(중력, 마찰력, 탄성 등)을 적용하여 고급 애니메이션을 구현하는 방법을 소개합니다.
Flutter는 물리 기반 애니메이션을 지원하기 위해 다양한 도구를 제공합니다.
이를 사용하면 애니메이션이 현실 세계의 물리 법칙을 따르도록 설계할 수 있습니다.
SpringSimulation을 활용하여 탄성 효과를 적용한 애니메이션을 구현합니다.
import 'package:flutter/material.dart';
import 'package:flutter/physics.dart';
class SpringAnimationExample extends StatefulWidget {
@override
_SpringAnimationExampleState createState() => _SpringAnimationExampleState();
}
class _SpringAnimationExampleState extends State<SpringAnimationExample> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
double _dragPosition = 0.0;
final double _springEnd = 0.0;
@override
void initState() {
super.initState();
_controller = AnimationController.unbounded(vsync: this);
_animation = _controller.drive(
Tween<double>(begin: _dragPosition, end: _springEnd),
);
}
void _onDragUpdate(DragUpdateDetails details) {
setState(() {
_dragPosition += details.delta.dy;
});
}
void _onDragEnd(DragEndDetails details) {
final simulation = SpringSimulation(
SpringDescription(
mass: 1.0,
stiffness: 100.0,
damping: 10.0,
),
_dragPosition,
_springEnd,
details.velocity.pixelsPerSecond.dy,
);
_controller.animateWith(simulation);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Spring Animation')),
body: Center(
child: GestureDetector(
onVerticalDragUpdate: _onDragUpdate,
onVerticalDragEnd: _onDragEnd,
child: AnimatedBuilder(
animation: _animation,
builder: (context, child) {
return Transform.translate(
offset: Offset(0, _animation.value),
child: Container(
width: 100,
height: 100,
color: Colors.blue,
),
);
},
),
),
),
);
}
}
중력을 활용하여 공이 바닥에서 튕기는 애니메이션을 구현합니다.
import 'package:flutter/material.dart';
import 'package:flutter/physics.dart';
class GravityAnimationExample extends StatefulWidget {
@override
_GravityAnimationExampleState createState() => _GravityAnimationExampleState();
}
class _GravityAnimationExampleState extends State<GravityAnimationExample> with SingleTickerProviderStateMixin {
late AnimationController _controller;
double _position = 0.0;
@override
void initState() {
super.initState();
_controller = AnimationController.unbounded(vsync: this);
_startGravity();
}
void _startGravity() {
final simulation = GravitySimulation(
1000.0, // 중력 가속도
_position,
500.0, // 바닥 위치
0.0, // 초기 속도
);
_controller.animateWith(simulation).then((_) {
setState(() {
_position = 0.0; // 초기 위치로 재설정
});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Gravity Animation')),
body: AnimatedBuilder(
animation: _controller,
builder: (context, child) {
return Transform.translate(
offset: Offset(0, _controller.value),
child: Center(
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
);
},
),
);
}
}
사용자의 입력과 물리 효과를 결합하여 직관적이고 생동감 있는 인터랙션을 구현할 수 있습니다.
예를 들어, 드래그 동작에 따라 스프링 효과를 적용하거나 중력 효과를 추가할 수 있습니다.
Flutter의 물리 효과는 애니메이션에 현실감을 더해줍니다. 위에서 소개한 사례를 바탕으로 다양한 물리 기반 애니메이션을 시도해 보세요. 다음 글에서는 물리 효과를 활용한 게임 애니메이션 구현을 다룰 예정입니다.
JSON 데이터 파싱: Flutter에서 효율적으로 다루는 방법 (0) | 2025.01.07 |
---|---|
Flutter 네트워크 통신 기초: HTTP 요청 보내기 (0) | 2025.01.06 |
제스처와 고급 물리 효과를 결합하는 방법 (0) | 2025.01.03 |
제스처와 애니메이션 결합하기 (0) | 2025.01.03 |
버튼 클릭 시 색상 변화 애니메이션 구현하기 (0) | 2025.01.03 |