상세 컨텐츠

본문 제목

Flutter 애니메이션 가이드: 기본 애니메이션 사용법

공부/Flutter

by micalcomanie 2025. 1. 1. 11:31

본문

728x90
반응형
SMALL

 

Flutter에서는 다양한 애니메이션 기능을 제공하여 생동감 있는 UI를 쉽게 구현할 수 있습니다.
이 글에서는 Flutter의 간단한 애니메이션 구현 방법을 소개합니다.


1. 애니메이션의 종류

Flutter에서 애니메이션은 크게 두 가지로 나눌 수 있습니다:

  • 암시적 애니메이션 (Implicit Animations):
    • 상태 변경에 따라 자동으로 애니메이션을 적용.
    • 사용 예: AnimatedContainer, AnimatedOpacity 등.
  • 명시적 애니메이션 (Explicit Animations):
    • 애니메이션의 시작, 중지, 지속 시간 등을 개발자가 직접 제어.
    • 사용 예: AnimationController, Tween, Animation 등.

2. 암시적 애니메이션

암시적 애니메이션은 간단한 애니메이션 효과를 구현할 때 적합합니다.

2.1 AnimatedContainer

AnimatedContainer는 컨테이너의 속성(크기, 색상, 여백 등)을 애니메이션으로 변경합니다.

import 'package:flutter/material.dart';

class AnimatedContainerExample extends StatefulWidget {
  @override
  _AnimatedContainerExampleState createState() => _AnimatedContainerExampleState();
}

class _AnimatedContainerExampleState extends State<AnimatedContainerExample> {
  bool _isBig = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedContainer Example'),
      ),
      body: Center(
        child: AnimatedContainer(
          width: _isBig ? 200 : 100,
          height: _isBig ? 200 : 100,
          color: _isBig ? Colors.blue : Colors.red,
          duration: Duration(seconds: 1),
          curve: Curves.easeInOut,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _isBig = !_isBig;
          });
        },
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

2.2 AnimatedOpacity

AnimatedOpacity는 위젯의 투명도를 애니메이션으로 변경합니다.

AnimatedOpacity(
  opacity: _isVisible ? 1.0 : 0.0,
  duration: Duration(seconds: 2),
  child: Text('Hello, Flutter!'),
)

3. 명시적 애니메이션

명시적 애니메이션은 더 복잡한 애니메이션을 제어할 때 사용됩니다.

3.1 AnimationController와 Tween

아래는 AnimationControllerTween을 활용한 간단한 예제입니다:

import 'package:flutter/material.dart';

class ExplicitAnimationExample extends StatefulWidget {
  @override
  _ExplicitAnimationExampleState createState() => _ExplicitAnimationExampleState();
}

class _ExplicitAnimationExampleState extends State<ExplicitAnimationExample>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<double> _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: Duration(seconds: 2),
      vsync: this,
    );
    _animation = Tween<double>(begin: 0, end: 300).animate(_controller);

    _controller.repeat(reverse: true);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Explicit Animation Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _animation,
          builder: (context, child) {
            return Container(
              width: _animation.value,
              height: _animation.value,
              color: Colors.blue,
            );
          },
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

4. 실습: 간단한 로딩 애니메이션

CircularProgressIndicator와 함께 AnimationController를 사용하여 로딩 애니메이션을 만들어보세요.

import 'package:flutter/material.dart';

class LoadingAnimation extends StatefulWidget {
  @override
  _LoadingAnimationState createState() => _LoadingAnimationState();
}

class _LoadingAnimationState extends State<LoadingAnimation>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: Duration(seconds: 2),
      vsync: this,
    )..repeat();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Loading Animation'),
      ),
      body: Center(
        child: CircularProgressIndicator(
          value: _controller.value,
          semanticsLabel: 'Loading',
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

5. 결론

Flutter에서 애니메이션은 사용자의 경험을 향상시키는 중요한 요소입니다. 간단한 암시적 애니메이션부터 명시적 애니메이션까지, 다양한 방식으로 애니메이션을 구현할 수 있습니다. 다음 글에서는 애니메이션 커브와 복합 애니메이션에 대해 다뤄보겠습니다.


참고 자료

728x90
반응형
LIST

관련글 더보기