如何在颤动中缩小和放大图标动画?

Posted

技术标签:

【中文标题】如何在颤动中缩小和放大图标动画?【英文标题】:How to shrink and grow icon animation in flutter? 【发布时间】:2020-08-03 20:32:04 【问题描述】:

我正在使用下面的代码来执行图标的动画增长和缩小动画,但为此,我必须点击图标,我希望动画在屏幕上重复。

return new Container(
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          new IconButton(
            onPressed: () 
              setState(() 
                if (_resized) 
                  _resized = false;
                  _height = 20.0;
                 else 
                  _resized = true;
                  _height = 40.0;
                
              );
            ,
            icon: Icon(Icons.calendar_today, size: _height),
            color: _color,
          ),
        ],
      ),
    );

我想要如下所示的输出,其中外部部分不断增长和缩小。

【问题讨论】:

【参考方案1】:

您可以使用多种方法来解决此问题。我更喜欢使用可重复的 AnimationController。

animationController = AnimationController(
  vsync: this,
  duration: Duration(seconds: 1),
)
  ..forward()
  ..repeat(reverse: true);

例如,您可以为按钮周围的填充大小设置动画。我会在 IconButton 周围使用圆形容器。

为此,您需要在您的状态下初始化 AnimationController。记住在小部件的生命周期结束时释放它。

这是一个关于 codepen 和 dartpad 的示例:

https://codepen.io/orestesgaolin/pen/MWajRGV

https://dartpad.dartlang.org/ca4838f17ea6061cf0212a4b689eaf2a

完整的源代码可以在这个要点中找到

import 'package:flutter/material.dart';
void main() 
  runApp(MyApp());


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Flutter Animated Icon',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  


class MyHomePage extends StatefulWidget 
  @override
  _MyHomePageState createState() => _MyHomePageState();


class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin 
  AnimationController animationController;

  @override
  void initState() 
    super.initState();
    animationController = AnimationController(
      vsync: this,
      duration: Duration(seconds: 1),
    )
      ..forward()
      ..repeat(reverse: true);
  

  @override
  void dispose() 
    animationController.dispose();
    super.dispose();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Container(
        color: Colors.blue,
        child: Center(
          child: AnimatedBuilder(
            animation: animationController,
            builder: (context, child) 
              return Container(
                decoration: ShapeDecoration(
                  color: Colors.white.withOpacity(0.5),
                  shape: CircleBorder(),
                ),
                child: Padding(
                  padding: EdgeInsets.all(8.0 * animationController.value),
                  child: child,
                ),
              );
            ,
            child: Container(
              decoration: ShapeDecoration(
                color: Colors.white,
                shape: CircleBorder(),
              ),
              child: IconButton(
                onPressed: () ,
                color: Colors.blue,
                icon: Icon(Icons.calendar_today, size: 24),
              ),
            ),
          ),

        ),
      ),
    );
  

【讨论】:

谢谢。这段代码运行良好。

以上是关于如何在颤动中缩小和放大图标动画?的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 中以编程方式放大和缩小:如何设置动画速度?

如何在 SwiftUI 中点击手势时放大缩小按钮动画?

recyclerview 在滚动时坚持使用图像放大/缩小动画的位置

如何放大并返回动画android?

怎么快速放大缩小字体

mapkit 缩小然后放大