상세 컨텐츠

본문 제목

물리 효과를 활용한 고급 애니메이션 구현

공부/Flutter

by micalcomanie 2025. 1. 3. 21:28

본문

728x90
반응형
SMALL

Flutter에서 물리 효과를 활용한 애니메이션은 현실적인 움직임과 자연스러운 사용자 경험을 제공합니다.
이 글에서는 물리 법칙(중력, 마찰력, 탄성 등)을 적용하여 고급 애니메이션을 구현하는 방법을 소개합니다.


1. Flutter에서 물리 효과란?

Flutter는 물리 기반 애니메이션을 지원하기 위해 다양한 도구를 제공합니다.
이를 사용하면 애니메이션이 현실 세계의 물리 법칙을 따르도록 설계할 수 있습니다.

1.1 주요 클래스 및 도구

  • Physics Simulation: SpringSimulation, GravitySimulation 등 물리 효과를 위한 시뮬레이션 도구.
  • AnimationController: 애니메이션의 실행 및 제어.
  • CustomScrollPhysics: 스크롤 동작에 맞춘 커스텀 물리 효과.

2. 기본 물리 효과 애니메이션

SpringSimulation을 활용하여 탄성 효과를 적용한 애니메이션을 구현합니다.

2.1 예제: 스프링 효과

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,
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

3. 고급 사례: 중력 기반 애니메이션

중력을 활용하여 공이 바닥에서 튕기는 애니메이션을 구현합니다.

3.1 예제: 중력 효과

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,
              ),
            ),
          );
        },
      ),
    );
  }
}

4. 물리 효과와 제스처 결합

사용자의 입력과 물리 효과를 결합하여 직관적이고 생동감 있는 인터랙션을 구현할 수 있습니다.
예를 들어, 드래그 동작에 따라 스프링 효과를 적용하거나 중력 효과를 추가할 수 있습니다.


5. 추가 아이디어

  1. 충돌 감지: 여러 개의 객체가 충돌하거나 상호작용하도록 설계.
  2. 물리 기반 UI 요소: 스프링 또는 중력을 적용한 자연스러운 UI 애니메이션.
  3. 게임 개발: 물리 효과를 활용한 간단한 게임 요소 구현.

6. 결론

Flutter의 물리 효과는 애니메이션에 현실감을 더해줍니다. 위에서 소개한 사례를 바탕으로 다양한 물리 기반 애니메이션을 시도해 보세요. 다음 글에서는 물리 효과를 활용한 게임 애니메이션 구현을 다룰 예정입니다.


참고 자료

728x90
반응형
LIST

관련글 더보기