암시적 애니메이션

  • 개발자가 직접 애니메이션의 세부 동작을 구현하지 않아도, 위젯의 속성이 변경되면 자동으로 애니메이션 효과가 적용되는 애니메이션

첫 번째 위젯

import 'package:flutter/material.dart';

class AnimatedAlignExample extends StatefulWidget {
  const AnimatedAlignExample({super.key});

  @override
  State<StatefulWidget> createState() => _AnimatedAlignExampleState();
}

class _AnimatedAlignExampleState extends State<AnimatedAlignExample> {
  bool selected = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selected = !selected;
        });
      },
      child: Container(
        height: 300,
        color: Colors.blue,
        child: AnimatedAlign(
          curve: Curves.easeIn,
          alignment: selected ? Alignment.topRight : Alignment.bottomLeft,
          duration: Duration(seconds: 1),
          child: Container(width: 50, height: 50, color: Colors.red),
        ),
      ),
    );
  }
}

AnimatedAlign 위젯

  • alignment 속성이 변경되면 애니메이션 진행되는 위젯
  • 위 코드에서는 alignment 속성이 topRight에서 bottomLeft로 변해, 컨테이너를 대각선으로 가로지르는 애니메이션이 출력된다.

두 번째 위젯

import 'package:flutter/material.dart';

class AnimatedContainerExample extends StatefulWidget {
  const AnimatedContainerExample({super.key});

  @override
  State<StatefulWidget> createState() => _AnimatedContainerExampleState();
}

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

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selected = !selected;
        });
      },
      child: Container(
        height: 300,
        width: double.infinity,
        color: Colors.green,
        alignment: Alignment.center,
        child: AnimatedContainer(
          height: selected ? 50 : 150,
          width: selected ? 50 : 150,
          decoration: BoxDecoration(
            color: selected ? Colors.red : Colors.amber,
            borderRadius: BorderRadius.circular(selected ? 0 : 20),
          ),
          curve: Curves.easeIn,
          duration: Duration(seconds: 1),
        ),
      ),
    );
  }
}

AnimatedContainer 위젯

  • alignment, decoration, width, height, padding 등의 속성이 변경되면 애니메이션 진행되는 위젯
  • 위 코드에서는 height, width가 각각 50에서 150으로 늘어나고, color가 빨간색에서 노란색으로, 테두리 모양이 직각에서 둥근 모양으로 변하는 것을 확인할 수 있다.

세 번째 위젯

import 'package:flutter/material.dart';

class AnimatedOpacityExample extends StatefulWidget {
  const AnimatedOpacityExample({super.key});

  @override
  State<StatefulWidget> createState() => _AnimatedOpacityExampleState();
}

class _AnimatedOpacityExampleState extends State<AnimatedOpacityExample> {
  bool selected = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selected = !selected;
        });
      },
      child: Container(
        height: 300,
        color: Colors.blue,
        alignment: Alignment.center,
        child: AnimatedOpacity(
          opacity: selected ? 0 : 1,
          curve: Curves.easeIn,
          duration: Duration(seconds: 1),
          child: Container(width: 200, height: 50, color: Colors.red),
        ),
      ),
    );
  }
}

AnimatedOpacity 위젯

  • opacity 속성이 변경되면 애니메이션 진행되는 위젯
  • 위 코드에서는 opacity가 0에서 1로 변해 투명했던 컨테이너가 나타나는 것을 볼 수 있다.

네 번째 위젯

import 'package:flutter/material.dart';

class AnimatedPositionedExample extends StatefulWidget {
  const AnimatedPositionedExample({super.key});
  @override
  State<AnimatedPositionedExample> createState() =>
      _AnimatedPositionedExampleState();
}

class _AnimatedPositionedExampleState extends State<AnimatedPositionedExample> {
  bool selected = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          selected = !selected;
        });
      },
      child: Container(
        height: 300,
        color: Colors.green,
        alignment: Alignment.center,
        child: Stack(
          children: [
            AnimatedPositioned(
              left: selected ? MediaQuery.of(context).size.width - 50 : 0,
              top: selected ? 250 : 0,
              curve: Curves.easeIn,
              duration: Duration(seconds: 1),
              child: Container(width: 50, height: 50, color: Colors.red),
            ),
          ],
        ),
      ),
    );
  }
}

AnimatedPositioned 위젯

  • position 속성이 변경되면 애니메이션 진행되는 위젯
  • AnimatedAlignment 위젯과 비슷하지만 조금 더 정확한 수치 조정을 할 수 있다.
  • 위 코드에서는 오른쪽 최하단에서 왼쪽 최상단으로 대각선 이동하는 듯한 애니메이션이 출력된다.

+ Recent posts