티스토리 뷰
Flutter에서 화면 간 전환은 사용자 경험을 크게 향상시키는 중요한 요소입니다. Hero 위젯은 이런 전환을 부드럽게 만들어주는 강력한 도구입니다. 이번 포스트에서는 Hero 위젯을 활용하여 두 화면 간 애니메이션 효과를 구현하는 방법을 단계별로 살펴보겠습니다.
참고. Animate a widget across screens
Hero 위젯이란 무엇인가요?
Hero 위젯은 Flutter에서 특정 위젯을 두 화면 사이에서 애니메이션으로 연결할 때 사용됩니다. 사용자가 이미지나 버튼을 클릭하면, 해당 요소가 첫 번째 화면에서 두 번째 화면으로 "날아가는" 효과를 제공합니다. 이를 통해 두 화면 간의 시각적 연결을 강조하고 사용자 경험을 더욱 직관적으로 만듭니다.
Hero 애니메이션 구현 단계
1. 두 화면에 동일한 이미지 표시
먼저, 두 화면을 생성하고 동일한 이미지를 표시합니다. GestureDetector를 사용해 화면 전환을 처리합니다.
import 'package:flutter/material.dart';
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Main Screen')),
body: GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const DetailScreen();
}));
},
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
);
}
}
class DetailScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Center(
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
);
}
}
2. Hero 위젯 추가
이제 Hero 위젯을 활용해 애니메이션 효과를 구현합니다. Hero 위젯은 두 가지 주요 속성을 필요로 합니다:
- tag: 애니메이션 연결을 위한 고유 식별자.
- child: 애니메이션에 사용될 위젯.
첫 번째 화면에 Hero 위젯을 추가합니다.
Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
)
두 번째 화면에도 동일한 Hero 위젯과 tag를 사용합니다.
Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
)
Hero 애니메이션이 제공하는 이점
- 시각적 연결: 두 화면 사이의 관계를 직관적으로 보여줍니다.
- 사용자 경험 강화: 부드러운 전환 효과로 앱 사용성을 높입니다.
- 간단한 구현: Flutter의 기본 위젯만으로도 쉽게 적용 가능합니다.
Hero 애니메이션 활용 팁
- tag의 고유성 보장: 앱 내 모든 Hero 위젯의 tag는 고유해야 합니다.
- 재사용 가능한 위젯 생성: 동일한 Hero 효과를 여러 화면에 사용하려면 재사용 가능한 위젯으로 만드는 것이 좋습니다.
- 복잡한 UI와 통합: Hero 위젯을 다른 애니메이션 위젯과 결합해 더 다채로운 전환 효과를 만들어 보세요.
결론: Hero 위젯으로 앱에 생동감을 더하자
Hero 위젯은 Flutter에서 시각적으로 매력적인 화면 전환을 구현하기 위한 필수 도구입니다. 간단한 코드로도 앱의 품질을 한 단계 업그레이드할 수 있으며, 사용자 경험을 크게 향상시킬 수 있습니다. 이제 Hero 위젯을 활용해 여러분의 Flutter 앱에 특별한 터치를 더해보세요.
import 'package:flutter/material.dart';
void main() => runApp(const HeroApp());
class HeroApp extends StatelessWidget {
const HeroApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Transition Demo',
home: MainScreen(),
);
}
}
class MainScreen extends StatelessWidget {
const MainScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Main Screen'),
),
body: GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return const DetailScreen();
}));
},
child: Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
);
}
}
class DetailScreen extends StatelessWidget {
const DetailScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Center(
child: Hero(
tag: 'imageHero',
child: Image.network(
'https://picsum.photos/250?image=9',
),
),
),
),
);
}
}
'Flutter Cookbook' 카테고리의 다른 글
Flutter에서 Named Route를 활용한 네비게이션 완벽 가이드 (0) | 2024.11.25 |
---|---|
Flutter 내비게이션 기본 가이드: 화면 전환과 경로 관리 완벽 이해 (0) | 2024.11.24 |
Flutter 앱에서 오류를 추적하고 보고하는 방법: Sentry 활용 가이드 (0) | 2024.11.22 |
Flutter로 여백이 있는 리스트 만들기: LayoutBuilder와 ConstrainedBox 활용 가이드 (0) | 2024.11.21 |
Flutter에서 긴 리스트를 효율적으로 다루는 방법: ListView.builder 완벽 가이드 (0) | 2024.11.20 |