Flutter使用AnimatedOpacity实现图片渐现动画

 更新时间:2022年03月23日 16:43:34   作者:岛上码农  
其实在Flutter中提供了一些封装好的动画组件,以便我们快速应用。本文将利用其中的AnimatedOpacity组件实现图片渐现动画效果,需要的可以参考一下

前言

我们介绍了几篇 Flutter 的动画控制类,相信大家对动画也有了一定的了解,可以通过这些基础的动画控制类实现自己想要的动画效果。在 Flutter 中也提供了一些封装好的动画组件,以便我们快速应用。本篇我们来介绍渐现效果 —— AnimatedOpacity

AnimatedOpacity 简介

顾名思义,AnimatedOpacity 就是用于动态展示组件的透明度。实际上,它实现的是将其子组件的透明度动态地从初始值过渡到指定值的动画效果。AnimatedOpacity的构造方法如下:

const AnimatedOpacity({
  Key? key,
  this.child,
  required this.opacity,
  Curve curve = Curves.linear,
  required Duration duration,
  VoidCallback? onEnd,
  this.alwaysIncludeSemantics = false,
}) 

对应的参数为:

  • child:要控制透明度的子组件;
  • opacity:最终的透明度值,需要是介于0-1之间的值;
  • curve:动效曲线,默认是线性的Curves.linear,可以使用 Curves 来构建曲线效果;
  • duration:动效时长;
  • alwaysIncludeSemantics:是否总是包含语义信息,默认是 false。这个主要是用于辅助访问的,如果是 true,则不管透明度是多少,都会显示语义信息(可以辅助朗读),这对于视障人员来说会更友好。
  • onEnd:动画结束回调方法。

AnimatedOpacity 应用

应用来说就很简单了,只需要把需要渐现的组件作为 AnimatedOpacity 的子组件,然后在发生事件到时候更改透明度即可。我们实现下面的图片渐现效果。

透明度渐变.gif

实现代码如下:

class AnimatedOpacityDemo extends StatefulWidget {
  const AnimatedOpacityDemo({Key? key}) : super(key: key);

  @override
  _AnimatedOpacityDemoState createState() => _AnimatedOpacityDemoState();
}

class _AnimatedOpacityDemoState extends State<AnimatedOpacityDemo> {
  var opacity = 0.0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedOpacity 动画'),
      ),
      body: Center(
        child: Stack(
          alignment: Alignment.center,
          children: [
            Text('小姐姐在哪'),
            AnimatedOpacity(
              duration: Duration(seconds: 3),
              opacity: opacity,
              child: ClipOval(
                child: Image.asset(
                  'images/beauty.jpeg',
                  width: 300,
                  height: 300,
                ),
              ),
              curve: Curves.ease,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Text(
          opacity == 0 ? 'Show' : 'Hide',
          style: TextStyle(
            color: Colors.white,
          ),
          textAlign: TextAlign.center,
        ),
        onPressed: () {
          setState(() {
            opacity = opacity == 0 ? 1.0 : 0.0;
          });
        },
      ),
    );
  }
}

图片渐现过渡

在相册类应用中,我们经常会看到一张图片逐渐渐变为另一张图片,从而提供更好的图片浏览体验,甚至造成一种时光如梭的感觉。这种效果可以使用 AnimatedOpactity 实现。将一张图片的透明度逐渐降低到0,另一张的透明度逐渐升高到1,从而可以实现图片渐变过渡的效果,例如下面的效果,是不是感觉小姐姐由清纯风变成高冷风的过渡更自然?

小姐姐风格变化.gif

实现的方式其实就是使用 Stack将两张图片堆叠在一起,然后让两张图片的透明度往相反的方向变化就可以实现这样的效果了,代码如下:

class _SwtichImageDemoState extends State<SwtichImageDemo> {
  var opacity1 = 1.0;
  var opacity2 = 0.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('图片切换'),
        brightness: Brightness.dark,
        backgroundColor: Colors.black,
      ),
      backgroundColor: Colors.black,
      body: Center(
        child: Stack(
          alignment: Alignment.center,
          children: [
            AnimatedOpacity(
              duration: Duration(milliseconds: 5000),
              opacity: opacity1,
              child: ClipOval(
                child: Image.asset(
                  'images/beauty.jpeg',
                  width: 300,
                  height: 300,
                ),
              ),
              curve: Curves.ease,
            ),
            AnimatedOpacity(
              duration: Duration(milliseconds: 5000),
              opacity: opacity2,
              child: ClipOval(
                child: Image.asset(
                  'images/beauty2.jpeg',
                  width: 300,
                  height: 300,
                ),
              ),
              curve: Curves.ease,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Text(
          '变',
          style: TextStyle(
            color: Colors.white,
          ),
          textAlign: TextAlign.center,
        ),
        onPressed: () {
          setState(() {
            opacity1 = 0.0;
            opacity2 = 1.0;
          });
        },
      ),
    );
  }
}

总结

本篇介绍了 Flutter 自带的渐现动画组件 AnimatedOpacity 的使用,借助 AnimatedOpacity 可以简化渐现动画的实现,比如一个组件的消失动画,两张图片的渐现切换过渡等效果。

以上就是Flutter使用AnimatedOpacity实现图片渐现动画的详细内容,更多关于Flutter图片渐现动画的资料请关注脚本之家其它相关文章!

相关文章

  • Android 实现带头部文字输入框的自定义控件

    Android 实现带头部文字输入框的自定义控件

    这篇文章主要介绍了Android 实现带头部文字输入框的自定义控件,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • 关于Android添加fragment后版本不兼容问题

    关于Android添加fragment后版本不兼容问题

    这篇文章主要介绍了Android添加fragment后版本不兼容问题的解决方法,需要的朋友可以参考下
    2017-12-12
  • 非常实用的侧滑删除控件SwipeLayout

    非常实用的侧滑删除控件SwipeLayout

    这篇文章主要为大家详细介绍了非常实用的侧滑删除控件SwipeLayout,类似于QQ侧滑点击删除效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android开发之使用150行代码实现滑动返回效果

    Android开发之使用150行代码实现滑动返回效果

    本文给大家分享Android开发之使用150行代码实现滑动返回效果的代码,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-05-05
  • android输入框内容改变的监听事件实例

    android输入框内容改变的监听事件实例

    下面小编就为大家分享一篇android输入框内容改变的监听事件实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 4种Android屏幕自适应解决方案

    4种Android屏幕自适应解决方案

    在开发android项目的时候,我们常常会考虑这样的问题:为不同的手机屏幕显示出最佳的界面,以提升用户的体验。本文介绍的是4种Android屏幕自适应解决方案,有兴趣的可以了解一下。
    2016-10-10
  • 深入解析Android中的setContentView加载布局原理

    深入解析Android中的setContentView加载布局原理

    在日常开发Android中setContentView是必不可少的一部分,下面这篇文章主要给大家介绍了关于Android中setContentView的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • 详解Android应用中屏幕尺寸的获取及dp和px值的转换

    详解Android应用中屏幕尺寸的获取及dp和px值的转换

    这篇文章主要介绍了Android应用中屏幕尺寸的获取及dp和px值的转换方法,这里主要介绍将dp转化为px值的例子,需要的朋友可以参考下
    2016-03-03
  • 详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    本篇文章主要介绍了详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Android在Kotlin中更好地使用LitePal

    Android在Kotlin中更好地使用LitePal

    今天小编就为大家分享一篇关于Android在Kotlin中更好地使用LitePal,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10

最新评论