Flutter:如何在英雄动画期间更改子元素的大小?

Posted

技术标签:

【中文标题】Flutter:如何在英雄动画期间更改子元素的大小?【英文标题】:Flutter: How to change size of sub-elements durring a hero animation? 【发布时间】:2018-11-03 04:31:17 【问题描述】:

我有一个英雄,它有一个子元素,我想在英雄动画中改变大小(在这种情况下,我希望改变它的纵横比)。

这是我的(精简的)构建方法:

Widget build(BuildContext build) 
  final aspect = expanded ? 1.3 : 1.0;
  return new Hero(
    child: Column(
      children: <Widget>[
      new AspectRatio(
        aspect: aspect,
        child: // Stuff that creates a header
      ),
      new Container(
        child: // General descriptions
      )
    ],
  );

现在,纵横比在两个值之间跳跃。我的问题是,我可以在英雄动画的同时为方面设置动画,并让它慢慢地从 1.3 切换到 1.0 并返回?

有关完整示例(在英雄动画期间还显示了一个奇怪的溢出问题),请参阅以下要点: https://gist.github.com/fuzzybinary/74196bccecc6dd070b35474c4c9223d7

【问题讨论】:

有了这个 sn-p 我无法弄清楚问题是什么。因此,发布您的完整代码,我会尽力为您提供解决方案。 我添加了一个带有完整示例的要点。 即使没有 AspectRatio,我也有同样的问题。在我的情况下,它是两个不同大小的图标。我怀疑这里是否有可能添加缩放动画,因为小部件大小是在转换后设置的(但我不确定)。 【参考方案1】:

由于我现在在我家,所以我现在无法试用您的代码。但我有一个可用的英雄动画示例。试试这个。

// main.dart class
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart' show timeDilation;
import 'package:flutter_test7/photo_hero.dart';
import 'package:flutter_test7/second_page.dart';

class HeroAnimation extends StatelessWidget 
  Widget build(BuildContext context) 
    timeDilation = 2.5; // 1.0 means normal animation speed.

    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Basic Hero Animation'),
      ),
      body: new Center(
        child: new PhotoHero(
          photo: 'images/flippers-alpha.png',
          width: 300.0,
          onTap: () 
            Navigator.of(context).pushNamed('/second_page');
          ,
        ),
      ),
    );
  


void main() 
  runApp(
    new MaterialApp(
      home: new HeroAnimation(),
      routes: <String, WidgetBuilder>
        '/second_page': (context) => new SecondPage()
      ,
    ),
  );


// photo_hero.dart class
import 'package:flutter/material.dart';

class PhotoHero extends StatelessWidget 
  const PhotoHero(Key key, this.photo, this.onTap, this.width)
      : super(key: key);

  final String photo;
  final VoidCallback onTap;
  final double width;

  Widget build(BuildContext context) 
    return new SizedBox(
      width: width,
      child: new Hero(
        tag: photo,
        child: new Material(
          color: Colors.transparent,
          child: new InkWell(
            onTap: onTap,
            child: new Image.asset(
              photo,
              fit: BoxFit.contain,
            ),
          ),
        ),
      ),
    );
  


// second_page.dart class
import 'package:flutter/material.dart';
import 'package:flutter_test7/photo_hero.dart';

class SecondPage extends StatefulWidget 
  @override
  _SecondPageState createState() => new _SecondPageState();


class _SecondPageState extends State<SecondPage> 
  @override
  Widget build(BuildContext context) 
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Flippers Page'),
      ),
      body: new Container(
        color: Colors.lightBlueAccent,
        padding: const EdgeInsets.all(16.0),
        alignment: Alignment.topLeft,
        child: new PhotoHero(
          photo: 'images/flippers-alpha.png',
          width: 100.0,
          onTap: () 
            Navigator.of(context).pop();
          ,
        ),
      ),
    );
  

希望这会有所帮助。

【讨论】:

我可以让英雄动画与单个布局子/图像一起工作,但当我组合多个布局子时它不起作用。 @Jeff 你也有同样的问题。我在这里提出了一个问题:github.com/flutter/flutter/issues/17924

以上是关于Flutter:如何在英雄动画期间更改子元素的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:同时进行英雄过渡 + 小部件动画?

如何在更改其边界的动画期间强制重绘 CALayer

如何在启动动画期间更改 iOS 应用程序图标背景颜色?

英雄动画在 Flutter 中不起作用

在 Flutter 中,我怎样才能更改一些小部件并看到它的动画到它的新大小?

iOS 8 自定义视图控制器演示:在动画期间更改呈现的 VC 的大小