Flutter/일반

[Flutter] μ• λ‹ˆλ©”μ΄μ…˜ νŽ˜μ΄μ§€(λΌμš°ν„°) μ΄λ™ν•˜λŠ”λ²• - Animate a page route transition

Hac. Dog 🌭 2023. 3. 2. 01:45

 

λ‚˜λŠ” ν”ŒλŸ¬ν„°λ₯Ό λ°°μšΈλ•Œ Navigator.of(context).push()λ₯Ό 톡해 λ‹¨μˆœ νŽ˜μ΄μ§€ μ „ν™˜λ§Œ λ˜λŠ”μ€„ μ•Œμ•˜λ‹€.

ν•˜μ§€λ§Œ κ³΅μ‹λ¬Έμ„œλ₯Ό λ³΄λ˜μ€‘ PageRouteBuilderλ₯Ό 톡해 μ „ν™˜μ„ 쒀더 λ…νŠΉν•˜κ²Œ ν•  수 μžˆλ‹€λŠ”κ²ƒμ„ μ•Œμ•˜λ‹€.

 

μ‚¬μš©λ²•μ€ 맀우 κ°„λ‹¨ν•˜λ‹€.

Route _createRoute() {
  return PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) => const Page2(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
    	const begin = Offset(0.0, 1.0);
        const end = Offset.zero;
        final tween = Tween(begin: begin, end: end);
        final offsetAnimation = animation.drive(tween);
        return child;
    },
  );
}

μœ„ μ½”λ“œκ°€ μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€.

μƒˆνŽ˜μ΄μ§€κ°€ λ°‘μ—μ„œλΆ€ν„° μœ„μͺ½μœΌλ‘œ 올라였게 λ˜λ―€λ‘œ offset을 주게 λœλ‹€.

begin λ˜λŠ” end 값을 (0.0~1.0) κ°’μœΌλ‘œ μ„€μ •

 

μ΄λ•Œ CurveTween을 μ‚¬μš©ν•˜μ—¬ 효과λ₯Ό μ€„μˆ˜ μžˆλ‹€.

var curve = Curves.ease;
var curveTween = CurveTween(curve: curve);

μ „μ²΄μ½”λ“œ

import 'package:flutter/material.dart';

void main() => runApp(
      MyApp(),
    );

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.of(context).push(
              _createRoute(),
            );
          },
          child: Text('Go'),
        ),
      ),
    );
  }
}

// https://docs.flutter.dev/cookbook/animation/page-route-animation
// μ€‘κ°„μ—μ„œ νŽ˜μ΄μ§€μ΄λ™μ‹œ 효과λ₯Ό μ€„μˆ˜ 있음
Route _createRoute() {
  return PageRouteBuilder(
    pageBuilder: (context, animation, secondaryAnimation) => Page2(),
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      const begin = Offset(0.0, 1.0);
      const end = Offset.zero;
      const curve = Curves.ease;
      final tween = Tween(begin: begin, end: end);

      final curvedAnimation = CurvedAnimation(parent: animation, curve: curve);

      return SlideTransition(
        position: tween.animate(curvedAnimation),
        child: child,
      );
    },
  );
}

class Page2 extends StatelessWidget {
  const Page2({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Text('Page 2'),
      ),
    );
  }
}

 

μœ„ λ‚΄μš©μ€ κ³΅μ‹λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

https://docs.flutter.dev/cookbook/animation/page-route-animation

 

Animate a page route transition

How to animate from one page to another.

docs.flutter.dev