Flutter 中 Hero(共享元素动画)

278 阅读1分钟

在Flutter中,Hero动画是一种用于在屏幕之间流畅转换共享元素的动画。它常用于在应用程序中创建吸引人的用户界面转换效果,例如从一个页面到另一个页面时,将共享的小部件(通常是图像)从一个位置动画到另一个位置。

Hero动画的基本原理是,在两个页面之间存在具有相同标识符(通常是tag)的小部件,Flutter会在这两个小部件之间创建一个动画,使得它们在屏幕上平滑地过渡。

以下是一个Hero动画的示例代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('First Page')),
      body: GestureDetector(
        onTap: () {
          Navigator.push(context, MaterialPageRoute(builder: (context) => SecondPage()));
        },
        child: Hero(
          tag: 'imageHero',
          child: Image.network(
            'https://example.com/image.jpg', // 图片地址
            width: 200,
            height: 200,
          ),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Page')),
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Hero(
            tag: 'imageHero',
            child: Image.network(
              'https://example.com/image.jpg', // 图片地址
              width: 400,
              height: 400,
            ),
          ),
        ),
      ),
    );
  }
}

在上面的示例中,我们在两个页面中使用了相同的Hero小部件,并为它们分配了相同的tag。当从第一页转换到第二页时,Flutter会自动在这两个小部件之间创建一个动画。这样,在页面切换时,图像就会平滑地过渡到新位置,从而创建出吸引人的动画效果。

需要注意的是,Hero动画通常用于在两个具有相似内容的页面之间共享过渡元素。在实际应用中,您可以根据需要在不同页面之间使用Hero动画,并根据需求调整共享元素的大小、位置和样式。