본문 바로가기
Flutter

Flutter AnimatedCrossFade로 매끄러운 전환 효과 구현하기: 예제 코드와 사용법 가이드

by 김무스비 2024. 11. 1.
728x90
반응형

Flutter로 앱을 개발하면서 화면 요소 간의 전환을 더 매끄럽게 만들고 싶다면, AnimatedCrossFade 위젯을 활용하는 것이 좋은 방법입니다. AnimatedCrossFade는 두 개의 위젯을 매끄럽게 전환하여 사용자 경험을 높일 수 있도록 해 주는 애니메이션 위젯입니다. 이 글에서는 AnimatedCrossFade가 무엇인지, 어떻게 사용하는지, 그리고 예제 코드와 함께 효과적인 활용법을 알아보겠습니다.

animated cross fade image

1. AnimatedCrossFade란?

AnimatedCrossFade 위젯은 두 개의 위젯을 전환할 때 부드러운 페이드(Fade)와 사이즈 전환 애니메이션을 적용해줍니다. 예를 들어 로딩 중인 상태에서 콘텐츠를 표시할 때, 버튼의 상태 변화, 간단한 탭 전환 등을 구현할 때 유용하게 사용할 수 있습니다. 이 위젯을 통해 두 위젯 간의 전환이 자연스럽게 이루어지므로 사용자가 더 매끄러운 화면 전환을 경험하게 됩니다.

2. AnimatedCrossFade의 기본 사용법

AnimatedCrossFade를 사용하려면 두 개의 위젯을 firstChild와 secondChild로 지정하고, crossFadeState 속성을 통해 현재 표시할 위젯을 선택합니다. 전환 속도는 duration으로 설정할 수 있습니다. 기본 사용 예제는 다음과 같습니다.

AnimatedCrossFade(
  duration: Duration(seconds: 1),
  firstChild: Container(
    color: Colors.blue,
    width: 200,
    height: 200,
    child: Center(child: Text('첫 번째 위젯', style: TextStyle(color: Colors.white))),
  ),
  secondChild: Container(
    color: Colors.green,
    width: 200,
    height: 200,
    child: Center(child: Text('두 번째 위젯', style: TextStyle(color: Colors.white))),
  ),
  crossFadeState: CrossFadeState.showFirst, // 표시할 위젯 선택
)

위 예제에서는 첫 번째와 두 번째 자식 위젯으로 각각 파란색과 녹색의 사각형을 사용하고 있습니다. crossFadeState 속성을 CrossFadeState.showFirst로 설정하면 첫 번째 위젯이 표시되고, CrossFadeState.showSecond로 변경하면 두 번째 위젯으로 전환됩니다.

3. AnimatedCrossFade 주요 속성

  • firstChild: 첫 번째 자식 위젯으로 전환 전 기본으로 표시할 위젯입니다.
  • secondChild: 두 번째 자식 위젯으로 전환 후 표시할 위젯입니다.
  • crossFadeState: 표시할 위젯을 지정하는 상태입니다. CrossFadeState.showFirst 또는 CrossFadeState.showSecond로 설정할 수 있습니다.
  • duration: 전환 애니메이션의 지속 시간으로, Duration을 통해 설정합니다.
  • sizeCurve: 두 위젯 간 크기 전환에 사용할 곡선(Curve) 애니메이션을 지정할 수 있습니다.
  • alignment: 두 위젯 간의 정렬을 설정할 수 있습니다. 기본값은 Alignment.center입니다.

4. AnimatedCrossFade 활용 예제

(1) 로딩 화면에서 콘텐츠로 전환하기

데이터를 로드하는 중 로딩 화면을 보여주고, 데이터가 준비되면 콘텐츠를 표시하는 경우에 AnimatedCrossFade를 사용할 수 있습니다.

class CrossFadeExample extends StatefulWidget {
  @override
  _CrossFadeExampleState createState() => _CrossFadeExampleState();
}

class _CrossFadeExampleState extends State<CrossFadeExample> {
  bool _isLoading = true;

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 2), () {
      setState(() {
        _isLoading = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: AnimatedCrossFade(
        duration: Duration(seconds: 1),
        firstChild: CircularProgressIndicator(),
        secondChild: Text('데이터 로드 완료!', style: TextStyle(fontSize: 24)),
        crossFadeState: _isLoading ? CrossFadeState.showFirst : CrossFadeState.showSecond,
      ),
    );
  }
}

이 예제에서는 Future.delayed로 간단한 로딩 시뮬레이션을 만들었습니다. 2초 뒤에 isLoading이 false로 바뀌면 로딩 인디케이터가 페이드 아웃되고, 텍스트가 페이드 인됩니다. 이를 통해 자연스러운 화면 전환을 구현할 수 있습니다.

(2) 버튼 전환 효과 만들기

버튼을 클릭하여 상태에 따라 다른 위젯을 표시하고 싶다면, AnimatedCrossFade를 활용할 수 있습니다.

class ToggleButtonExample extends StatefulWidget {
  @override
  _ToggleButtonExampleState createState() => _ToggleButtonExampleState();
}

class _ToggleButtonExampleState extends State<ToggleButtonExample> {
  bool _isExpanded = false;

  void _toggle() {
    setState(() {
      _isExpanded = !_isExpanded;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          AnimatedCrossFade(
            duration: Duration(milliseconds: 500),
            firstChild: ElevatedButton(
              onPressed: _toggle,
              child: Text('더 보기'),
            ),
            secondChild: ElevatedButton(
              onPressed: _toggle,
              child: Text('접기'),
            ),
            crossFadeState: _isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst,
          ),
          if (_isExpanded)
            Container(
              padding: EdgeInsets.all(16),
              color: Colors.lightBlueAccent,
              child: Text('더보기 내용이 여기에 표시됩니다.', style: TextStyle(color: Colors.white)),
            ),
        ],
      ),
    );
  }
}

이 예제에서는 버튼의 텍스트가 "더 보기"와 "접기"로 전환되는 효과를 구현했습니다. _toggle 함수로 _isExpanded 상태를 변경하여 버튼과 함께 표시할 추가 콘텐츠를 제어할 수 있습니다. 버튼과 관련된 애니메이션 전환이 자연스럽게 이루어져 사용자 경험이 개선됩니다.

5. AnimatedCrossFade 사용 시 주의 사항

AnimatedCrossFade는 두 개의 위젯 간 전환만 지원하므로, 세 개 이상의 위젯을 교체하며 표시해야 할 경우 다른 방법이 필요할 수 있습니다. 또한, 자식 위젯의 사이즈가 크게 달라질 경우 전환이 매끄럽지 않을 수 있으므로 유사한 크기의 자식 위젯을 사용하는 것이 좋습니다.

6. AnimatedCrossFade와 유사한 위젯

Flutter에는 다양한 애니메이션 관련 위젯들이 있으며, AnimatedCrossFade 외에도 여러 전환 애니메이션 위젯이 있습니다. 예를 들어, AnimatedSwitcher는 여러 위젯을 전환할 때 사용하기 좋으며, AnimatedOpacity는 특정 위젯의 투명도를 조정하여 자연스러운 전환을 구현할 수 있습니다. 앱의 요구 사항에 따라 적합한 애니메이션 위젯을 선택하여 사용자 경험을 강화할 수 있습니다.

결론

AnimatedCrossFade는 Flutter에서 간단하게 전환 애니메이션을 구현할 수 있도록 돕는 매우 유용한 위젯입니다. firstChild와 secondChild 두 개의 위젯을 설정하고 crossFadeState만 제어하면 손쉽게 전환 애니메이션을 만들 수 있어, 로딩 화면, 버튼 전환, 또는 간단한 컨텐츠 변경 효과를 부드럽게 처리할 수 있습니다. AnimatedCrossFade를 활용하여 더 자연스럽고 매끄러운 UI 전환을 구현해 보세요.

728x90
반응형