精华内容
下载资源
问答
  • 过渡和动画的基本介绍过渡初始过渡的四大要素过渡的简写方式动画的创建动画的七大要素动画的播放和暂停过渡和动画的区别 过渡初始 过渡:元素从一种样式变换为另一种样式时为元素添加效果 过渡不同于动画,他不会...

    过渡初始

    过渡:元素从一种样式变换为另一种样式时为元素添加效果
    过渡不同于动画,他不会无缘无故的发生,过渡必须要触发一个事件才能实现效果,鼠标在hover状态下相当于一个移入事件

    过渡的四大要素

    1、要控制的css属性名,默认值:all,不是必需
    2、完成过渡需要的时间,s,ms 1000ms=1s 必须要有
    3、过渡的速度曲线,不是必需,ease默认值
    ease 变速,规定慢速开始,然后变快,然后慢速结束的过渡效果
    linear 匀速,规定以相同速度开始至结束的过渡效果
    ease-in 规定以慢速开始的过渡效果
    ease-out 规定以慢速结束的过渡效果
    ease-in-out 规定以慢速开始和结束的过渡效果
    cubic-bezier(n,n,n,n) 在cubic-bezier函数中定义自己的值可能的值是0至1之间的数值
    4、过渡延迟时间,s,ms

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>过渡的四大要素</title>
        <style>
            .box{
                width: 100px;
                height: 100px;
                background: red;
                margin: 100px auto;
                /*多个属性可以逗号隔开*/
                /*要控制的css属性名*/
                transition-property:width,background,height ;
                /*完成过渡需要的时间*/
                transition-duration: 2s,3s,5s;
                /*过渡的速度曲线*/
                /*transition-timing-function: linear;*/
                transition-timing-function: linear,linear,ease;
                /*过渡延迟时间,s,ms*/
                transition-delay: 500ms,300ms,500ms;
            }
            .box:hover{
                background: blue;
                width: 500px;
                height: 300px;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    </html>
    

    过渡的简写方式

    1. 所有要控制的样式使用相同的过渡方式
    • 属性值依次:all 完成过渡的时间 速度曲线 延迟开始时间
    • 如果使用变速,速度曲线也可以不写
    • 如果延迟开始时间没有,也可以不写
    1. 要控制的样式使用不同的过度方法
    • 对要控制的css属性分组,每一组可以书写不同的过渡方式,组与组之间用逗号隔开
    • 每一组书写方法:要控制的css属性名 完成过渡的时间 速度曲线 延迟开始时间
    • 如果哪一组的值使用默认值,也可以不写
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>过渡的简写方式</title>
        <style>
            .box{
                width: 100px;
                height: 100px;
                background: red;
                margin: 100px auto;
                /*transition: all 2s linear 1s;*/
                /*transition: 2s linear 1s;*/
                /*transition: 2s;*/
                transition: width 2s 1s,height 3s,background 4s linear 1s;
            }
            .box:hover{
                background: blue;
                width: 500px;
                height: 300px;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    </html>
    

    动画的创建

    动画,通过改变元素的样式给元素添加动画
    动画的创建有两种方式:

    1. from-to :from{}代表动画开始;to{}代表动画结束
    2. 百分比创建动画(推荐使用):0%{};代表动画开始,后面可以设置多个关键帧,如:50%{};80%{}……,100%{};代表动画结束。
    3. @keyframes用于创建一个动画,动画名称自己设置
    4. 语法:animation:要绑定的动画名称 动画完成的时间 速度曲线 延迟开始时间 播放次数 轮流反向播放 保持最后状态
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>动画初始</title>
        <style>
            .box{
                width: 100px;
                height: 100px;
                background: red;
                margin: 100px auto;
                /*animation: name 10s linear 3s;*/
                /*语法*/
                /*    animation:要绑定的动画名称 动画完成的时间 速度曲线 延迟开始时间 播放次数 轮流反向播放 保持最后状态*/
                
                /*  延迟开始时间: s,ms*/
                /*  播放次数:默认值为1次,infinite无限次播放*/
                /*animation: name 5s 2;*/
                /*animation: name 2s infinite;*/
    
                /*轮流反向播放:默认值normal,轮流反向播放alternate,必须要有播放次数*/
                    /*animation: name 5s 2 alternate;*/
    
                /*保持最后的状态:forwards*/
                    animation: name 5s forwards;
            }
            /*@keyframes用于创建一个动画,动画名称自己设置*/
            @keyframes name {
                /*!*动画开始*!*/
                /*from{width: 100px;height: 100px;background: red;}*/
                /*!*动画结束*!*/
                /*to{width: 500px;height: 500px;background: blue;}*/
    
                /*百分比指的是动画完成时的百分比*/
                0%{width: 100px;height: 100px;background: red;}
                30%{width: 200px;height: 300px;background: green;}
                50%{width: 200px;height: 300px;background: green;}
                80%{width: 200px;height: 300px;background: yellow;}
                100%{width: 500px;height: 500px;background: blue;}
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    </html>
    

    动画的七大要素

    1.要绑定的动画名称:必须要有
    2. 动画完成的时间:必须要有 s,ms
    3. 速度曲线,默认ease变速,凡是只要过渡能用的动画都能用
    4. 延迟开始时间: s,ms
    5. 播放次数:默认值为1次,infinite无限次播放
    6. 轮流反向播放:默认值normal,轮流反向播放alternate,必须要有播放次数
    7. 保持最后的状态:forwards

    动画的播放和暂停

    animation-play-state规定动画播放(running)还是暂停(paused)
    动画的暂停:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>动画的暂停</title>
        <style>
            .box{
                width: 100px;
                height: 100px;
                background: red;
                margin: 100px auto;
                animation: name 10s;
            }
            .box:hover{
                animation-play-state: paused;
            }
            /*@keyframes用于创建一个动画,动画名称自己设置*/
            @keyframes name {
                0%{width: 100px;height: 100px;background: red;}
                100%{width: 500px;height: 500px;background: blue;}
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    </html>
    

    动画的播放

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>动画的播放</title>
        <style>
            .box{
                width: 100px;
                height: 100px;
                background: red;
                margin: 100px auto;
                animation: name 10s;
                animation-play-state: paused;
            .box:hover{
                animation-play-state: running;
            }
            /*@keyframes用于创建一个动画,动画名称自己设置*/
            @keyframes name {
                0%{width: 100px;height: 100px;background: red;}
                100%{width: 500px;height: 500px;background: blue;}
            }
        </style>
    </head>
    <body>
        <div class="box"></div>
    </body>
    </html>
    

    过渡和动画的区别

    1.过渡需要事件触发,动画不需要事件触发
    2.过渡只有开始-结束,动画可以设置多个关键帧

    展开全文
  • 本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程。 1. 动画四要素 动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的。在 Flutter 中,动画的过程又被量化...

    本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程。

    1. 动画四要素

    动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的。在 Flutter 中,动画的过程又被量化成一段值区间,我们可以利用这些值设置控件的各个属性来实现动画,其内部由四个关键的部分来实现这一过程。

    1.1 插值器(Tweens)

    tweens 可为动画提供起始值和结束值。默认情况下,Flutter 中的动画将任何给定时刻的值映射到介于 0.0 和 1.0 之间的 double 值。 我们可以使用以下 Tween 将其间值的范围定义为从 -200.0变为 0.0:

    tween = Tween<double>(begin: -200, end: 0);
    复制代码

    我们也可以将值设置为相应需要改变的对象值,比如将起始值设置为红色,结束值设置为蓝色,那么 tweens 产生的动画便是由红渐渐的变成蓝色。如下:

    colorTween = ColorTween(begin: Colors.red, end: Colors.blue);
    复制代码

    1.2 动画曲线(Animation Curves)

    Curves 用来调整动画过程中随时间的变化率,默认情况下,动画以均匀的线性模型变化。读者可以通过自定义继承 Curves 的类来定义动画的变化率,比如设置为加速、减速或者先加速后减速等曲线模型。Flutter 内部也提供了一系列实现相应变化率的 Curves 对象:

    • linear
    • decelerate
    • ease
    • easeIn
    • easeOut
    • easeInOut
    • fastOutSlowIn
    • bounceIn
    • bounceOut
    • bounceInOut
    • elasticIn
    • elasticOut
    • elasticInOut

    几个代表的动画曲线模型图如下:

    1.3 Ticker providers

    Flutter 中的动画以屏幕频繁的重绘而实现,即每秒 60 帧。Ticker 可以被应用在 Flutter 每个对象中,当对象实现了 Ticker 的功能后,每次动画帧改变便会通知该对象。这里,开发者们不需要为对象手动实现 Ticker,flutter 提供了 TickerProvider 类可以帮助我们快速实现该功能。例如,在有状态控件下使用动画时,通常需要在 State 对象下混入 TickerProviderStateMixin。

    class _MyAnimationState extends State<MyAnimation> 
        with TickerProviderStateMixin {
        
    }
    复制代码

    1.4 动画控制器(AnimationController)

    Flutter 中动画的实现还有一个非常重要的类 AnimationController,即动画控制器。很明显,我们用它来控制动画,即动画的启动、暂停等。其接受两个参数,第一个是 vsync,为 Ticker 对象,其作用是当接受到来自 tweens 和 curves 的新值后通知对应对象,第二个 duration 参数为动画持续的时长。

    // 混入 SingleTickerProviderStateMixin 使对象实现 Ticker 功能
    class _AnimatedContainerState extends State<AnimatedContainer>
            with SingleTickerProviderStateMixin {
      AnimationController _controller;
    
      @override
      void initState() {
        super.initState();
        // 创建 AnimationController 动画
        _controller = AnimationController(
          // 传入 Ticker 对象
          vsync: this,
          // 传入 动画持续时间
          duration: new Duration(milliseconds: 1000),
        );
        startAnimation();
      }
    
      Future<void> startAnimation() async {
        // 调用 AnimationController 的 forward 方法启动动画
        await _controller.forward();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          width: _controller.value;
          child: //...
        );
      }
    }
    复制代码

    AnimationController 继承自 Animation,具有一系列控制动画的方法,如可用 forward() 方法来启动动画,可用 repeat() 方法使动画重复执行,也可以通过其 value 属性得到当前值。

    1.4.1 Animation

    我们可以通过在 CurvedAnimation 传入 AnimationController 和 Curve 对象创建一个 Animation 对象,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    final Animation<double> animation = CurvedAnimation(
      parent: controller,
      curve: Curves.ease,
    );
    复制代码

    也可以通过调用 tween 的 animate 方法传入 controller 对象创建 Animation 对象,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    Animation<int> alpha = IntTween(begin: 0, end: 255).animate(controller);
    复制代码

    Animation 是一个抽象类,其中保存了动画的过程值(value)和状态,下面是四种状态类型。

    enum AnimationStatus {
      /// 动画处于停止状态
      dismissed,
      /// 动画从头到尾执行
      forward,
      /// 动画从尾到头执行
      reverse,
      /// 动画已执行完成
      completed,
    }
    复制代码

    AnimationController 是它的一个实现类。其内部通过范型机制可实现对各类型对象的动画,比如 Animation<double>Animation<Color>Animation<Size> 等。其另一个实现类 Curved­Animation,可以用来与 Curves 结合实现各类曲线模型函数的动画。

    Animation 另一个实现方法是调用 tween 对象的 animate 方法传入 Animation 对象创建另一个 Animation 对象,该方法可通过将使动画值定义在 tween 区间内,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    final Animation curve =
        CurvedAnimation(parent: controller, curve: Curves.easeOut);
    Animation<int> alpha = IntTween(begin: 0, end: 255).animate(curve);
    复制代码

    1.4.5 动画监听

    Animation 对象可以有设置两种监听器,分别是帧监听器和状态监听器。使用 addListener() 添加帧监听器,使用addStatusListener() 添加状态监听器。

    只要动画的值发生变化,就会触发帧监听器的回调。 通常,我们在其内部调用 setState() 来重建组件来实现动画效果,如下:

    animation = new CurvedAnimation(
            parent: animationController, curve: Curves.elasticOut)
    animation.addListener(() => this.setState(() {}))
    复制代码

    动画开始,结束,前进或后退时会触发 StatusListener 的回调,如下:

    animation = new CurvedAnimation(
            parent: animationController, curve: Curves.elasticOut)
    animation.addStatusListener((AnimationStatus status) {});
    复制代码

    2. 动画组件

    我们已经知道了 Flutter 控制动画的四大要素,其中涉及的各个概念可以帮助我们设计出各种各样的动画效果,但不免也多了一些需要重复编写的模版代码,比如,在 Animation 的帧监听器设置的监听器回调里,几乎所有场景中我们都只是调用 setState(),再比如 State 对象每次都需要我们手动地混入 SingleTickerProviderStateMixin 等等这类情况。Flutter 为了提高开发者的开发效率,提供了 AnimatedWidget 抽象类来封装这部分模版代码,其源码非常简单,如下:

    abstract class AnimatedWidget extends StatefulWidget {
      /// Creates a widget that rebuilds when the given listenable changes.
      ///
      /// The [listenable] argument is required.
      const AnimatedWidget({
        Key key,
        @required this.listenable
      }) : assert(listenable != null),
           super(key: key);
    
      /// The [Listenable] to which this widget is listening.
      ///
      /// Commonly an [Animation] or a [ChangeNotifier].
      final Listenable listenable;
    
      /// Override this method to build widgets that depend on the state of the
      /// listenable (e.g., the current value of the animation).
      @protected
      Widget build(BuildContext context);
    
      /// Subclasses typically do not override this method.
      @override
      _AnimatedState createState() => _AnimatedState();
    }
    
    class _AnimatedState extends State<AnimatedWidget> {
      @override
      void initState() {
        super.initState();
        widget.listenable.addListener(_handleChange);
      }
    
      @override
      void didUpdateWidget(AnimatedWidget oldWidget) {
        super.didUpdateWidget(oldWidget);
        if (widget.listenable != oldWidget.listenable) {
          oldWidget.listenable.removeListener(_handleChange);
          widget.listenable.addListener(_handleChange);
        }
      }
    
      @override
      void dispose() {
        widget.listenable.removeListener(_handleChange);
        super.dispose();
      }
    
      void _handleChange() {
        setState(() {
          // The listenable's state is our build state, and it changed already.
        });
      }
    
      @override
      Widget build(BuildContext context) => widget.build(context);
    }
    复制代码

    AnimatedWidget 作为一个抽象类可供我们实现一个我们自己的具体类,其接受一个 Listenable 对象作为参数,并需要重写 build 方法。我们上一节中多次提到的 Animation 继承自 Listenable。下面的这个这个组件就是我自己实现的动画组件:??

    class Sun extends AnimatedWidget {
      Sun({Key key, Animation<Color> animation})
          : super(key: key, listenable: animation);
    
      @override
      Widget build(BuildContext context) {
        final Animation<Color> animation = listenable;
        var maxWidth = MediaQuery.of(context).size.width;
        var margin = (maxWidth * .3) / 3;
    
        return new AspectRatio(
            aspectRatio: 1.0,
            child: new Container(
                margin: EdgeInsets.symmetric(horizontal: margin),
                constraints: BoxConstraints(
                  maxWidth: maxWidth,
                ),
                decoration: new BoxDecoration(
                  shape: BoxShape.circle,
                  color: animation.value,
                )));
      }
    }
    复制代码

    我们可以通过传入已经定义好的 Animation 对象来使用该组件:??

    class AnimateWidgetState extends State<AnimateWidget> {
      AnimationController _animationController;
      ColorTween _colorTween;
      ...
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: 
              Column(
            children: <Widget>[
              Sun(animation: _colorTween.animate(_animationController)),
            ],
          ),
        );
      }
    }
    复制代码

    这样我们就封装了自己的一个动画组件,另外,Flutter 内部为我们提供了多个已经封装好的动画组件,利用好这些组件可以大大地提高我们的开发效率:

    • SlideTransition
    • ScaleTransition
    • RotationTransition
    • SizeTransition

    3. 隐式动画组件

    利用动画组件我们已经可以方便地封装出一系列控件动画了,但是这种实现方式均需要我们自己提供 Animation 对象,然后通过提供的接口方法来启动我们的动画,控件的属性由 Animation 对象提供并在动画过程中改变而达到动画的效果。为了使动画使用起来更加方便,Flutter 帮助了开发者从另一个角度以更简单的方式实现了动画效果——隐式动画组件(ImplicitlyAnimatedWidget)。

    通过隐式动画组件,我们不需要手动实现插值器、曲线等对象,开发者甚至也不需要使用 AnimationController 来启动动画,它的实现方式更贴近对组件本身的操作,我们可以直接通过 setState() 的方法改变隐式动画组件的属性值,其内部自行为我们实现动画过程的过渡效果,即隐藏了所有动画实现的细节。Flutter 内部为我们提供了多个实用的隐式动画组件,我们本节分别介绍 AnimatedContainer 和 AnimatedOpacity 这两个最常用的隐式动画组件。

    3.1 AnimatedContainer

    AnimatedContainer 是我们最常使用到的隐式动画组件之一,从名字可以看出这个控件是以动画形式而成的 Contianer 控件,它们都是页面中渲染一个空的容器并且使用方法也非常相似。我们可以用下面的方式使用 Contianer 控件:

    var height = 40.0  
    ...
        
    Container(
        width: 60.0,
        height: height,
        color: Color(0xff14ff65),
      ),
    复制代码

    上面的代码中,我们将 Container 的高度设置为 height 变量,即为 40.0,当我们使用一个 Button 按钮触发改变 height 值的事件并且重绘界面时,Container 的高度会随之改变:

    onPressed: (){
      setState(() {
        height = 320.0;
      });
    },
    复制代码

    但这种变化很明显仅是属性的改变并不是一个平滑的过渡动画,然而同样的事件发生在 AnimatedContainer 控件上,便会有一个渐变的效果:

    AnimatedContainer(
      duration: Duration(seconds: 5),
      width: 60.0,
      height: height,
      color: Color(0xff14ff65),
    )
    复制代码

    使用 AnimatedContainer 后,我们再次触发 height 变量改变后,页面中的 AnimatedContainer 便会平滑的过渡到相应的高度,其 duration 属性用于设置动画过渡的时间,这里,我们设置为 5 秒??。

    我们可以用相同的方式为 Container 的 Color、width 等各种属性设置动画,同时也可以通过为其设置 alignment 属性来设置其内部子控件的位置。

    3.2 AnimatedOpacity

    在 Flutter 中,另一种常用的动画是控件透明度的过渡动画,其对应的隐式动画组件为 AnimatedOpacity。它的用法与 Opacity 相似,内部持有的 opacity 属性可以设置为 0.0~1.0 中的任意浮点数,分别对应完全透明与完全不透明,使用下面的方式,我们便可以设置了一个半透明的 Opacity 控件:

    Opacity(
        opacity: 0.5,
        child: Text("hello"),
    )
    复制代码

    我们以相同的方法使用 AnimatedOpacity:

    double opacity = 1.0;
    ...
    AnimatedOpacity(
        opacity: opacity,
        duration: Duration(seconds: 1),
        child: Text("hello"),
    )
    复制代码

    它也接受 duration 属性来设置过渡时间,通过改变 opacity 变量的值可以实现透明度变化的动画效果:

    setState(() {
    	opacity = 0.0;
    });
    复制代码

    3.3 隐式动画原理简析

    我们已经在之前的部分中介绍了 Flutter 中的三棵重要的树及它们在组件渲染中的作用了。在元素树中,每个 Element 对象持有控件树中 Widget 组件的状态信息,这里我们将它称为 State 对象,Widget 刷新重建时,Element 会对比自己所对应 Widget 是否更新而做出相应屏幕渲染上的改变。

    在各个隐式动画组件中,其动画信息便储存在 Element 所持有的 State 对象中,Widget 每次刷新都会引起 Element 对其重新引用,当对应的 Widget 类型改变则其 Element 会连带 State 对象自然而然的需要重新渲染,然而当 Widget 类型不变,则 Element 不需要重建,只需要改变 State 对象储存的动画信息即可。这样一种连续更新属性的过程便实现了更为我们所方便使用的隐式动画。

    3.4 实现自定义隐式动画组件

    实现自定义的隐式动画组件,我们需要使用到两个类:ImplicitlyAnimatedWidget 和 AnimatedWidgetBaseState。

    ImplicitlyAnimatedWidget 是所有隐式动画组件的父类,继承自 StatefulWidget,并且仅需要接受动画曲线 curve 与动画过渡时长 duration 两个参数:

    const ImplicitlyAnimatedWidget({
        Key key,
        this.curve = Curves.linear,
        @required this.duration
      }) 
    复制代码

    在我们自定义的隐式动画组件可以扩充他的参数类型满足我们的需求。

    AnimatedWidgetBaseState 即 ImplicitlyAnimatedWidget 这个有状态组件所对应的 State 对象类,我们自定义的隐式动画组件所对应的 State 也必须继承该类,其内部需要重写 forEachTween 方法。

    下面就是我自己定义的隐式动画组件:

    class MyAnimatedWidget extends ImplicitlyAnimatedWidget {
      MyAnimatedWidget({
        Key key,
        this.param, //导致动画的参数
        Curve curve = Curves.linear,
        @required Duration duration,
      }) :super(key: key, curve: curve, duration: duration);
      final double param;
      
      @override
      _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
    }
    
    class _MyAnimatedWidgetState extends AnimatedWidgetBaseState<MyAnimatedWidget> {
      Tween<double> _param; // State 内部保存的当前状态信息,类型为 Tween
      
      @override
      void forEachTween(TweenVisitor<dynamic> visitor) {
        _param = visitor(_param, widget.param, (value) => Tween<double>(begin: value));
      }
      
      @override
      Widget build(BuildContext context) {
        //return a widget built on a parameter
      }
    }
    复制代码

    上面代码中,我们在父类的基础之上拓展了 param 参数,其是我们在动画过程中需要关注的动画属性值。我们还需要重点关注 _MyAnimatedWidgetState 类中 forEachTween 方法,它是隐式动画实现的核心方法,其用于每次更新组件的动画属性,接受一个 TweenVisitor 对象 visitor 作为参数。visitor 同时接受是那个参数,第一个为一个插值器对象 Tween<T>,其是应用在属性中的插值器当前补间值,第二个参数为一个 T 类型的值,即新的目标属性值,第三个参数为一个回调函数,用于配置给定的 value 值作为新的插值器开始值。TweenVisitor 函数返回一个 Tween<T> 对象,我们将其赋值给组件中当前的插值器对象作为下次调用 forEachTween 方法时的当前值。

    4. 其他

    笔者水平有限,如果文中有错误的地方,请留言指正。

    欢迎一起交流学习,联系方式:

    我的博客原文:meandni.com/2019/07/01/…

    Github:github.com/MeandNi

    微信:yangjk128

    5. 参考

    Flutter Doc

    Flutter Animated Series : Animated Containers

    转载于:https://juejin.im/post/5d19fea65188255cfc1a0494

    展开全文
  • 1. 动画四要素动画在各个平台的实现原理都基本相同,都是由在一段时间内一系列连续变化画面的帧构成的。在 Flutter 中,动画的过程又被量化成一段值区间,我们可以利用这些值设置控件的各个属性来实现动画,其内部由...

    点击上方蓝字、关注

    77e8f5cb20ec8731dce014a9fbde1b6f.gif

    及时阅读最新文章

    本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程。

    1. 动画四要素

    动画在各个平台的实现原理都基本相同,都是由在一段时间内一系列连续变化画面的帧构成的。在 Flutter 中,动画的过程又被量化成一段值区间,我们可以利用这些值设置控件的各个属性来实现动画,其内部由四个关键的部分来实现这一过程。

    1.1 插值器(Tweens)

    tweens 可为动画提供起始值和结束值。默认情况下,Flutter 中的动画将任何给定时刻的值映射到介于 0.0 和 1.0 之间的 double 值。我们可以使用以下 Tween 将其间值的范围定义为从 -200.0变为 0.0:

    tween = Tween<double>(begin: -200, end: 0);

    我们也可以将值设置为相应需要改变的对象值,比如将起始值设置为红色,结束值设置为蓝色,那么 tweens 产生的动画便是由红渐渐的变成蓝色。如下:

    colorTween = ColorTween(begin: Colors.red, end: Colors.blue);

    1.2 动画曲线(Animation Curves)

    Curves 用来调整动画过程中随时间的变化率,默认情况下,动画以均匀的线性模型变化。读者可以通过自定义继承 Curves 的类来定义动画的变化率,比如设置为加速、减速或者先加速后减速等曲线模型。Flutter 内部也提供了一系列实现相应变化率的 Curves 对象:

    • linear
    • decelerate
    • ease
    • easeIn
    • easeOut
    • easeInOut
    • fastOutSlowIn
    • bounceIn
    • bounceOut
    • bounceInOut
    • elasticIn
    • elasticOut
    • elasticInOut

    相关动画曲线模型图如下:

    63df74f9b0e29645fdf79a7e0c96d45b.gif

    170e36ef8692442721137b6d6ad35980.gif

    0d4247b64af5069fdbfc831a8245a34b.gif

    1.3 Ticker providers

    Flutter 中的动画以屏幕频繁的重绘而实现,即每秒 60 帧。Ticker 可以被应用在 Flutter 每个对象中,当对象实现了 Ticker 的功能后,每次动画帧改变便会通知该对象。这里,开发者们不需要为对象手动实现 Ticker,flutter 提供了 TickerProvider 类可以帮助我们快速实现该功能。例如,在有状态控件下使用动画时,通常需要在 State 对象下混入 TickerProviderStateMixin。

    class _MyAnimationState extends State<MyAnimationwith TickerProviderStateMixin {
        
    }

    1.4 动画控制器(AnimationController)

    Flutter 中动画的实现还有一个非常重要的类 AnimationController,即动画控制器。很明显,我们用它来控制动画,即动画的启动、暂停等。其接受两个参数,第一个是 vsync,为 Ticker 对象,其作用是当接受到来自 tweens 和 curves 的新值后通知对应对象,第二个 duration 参数为动画持续的时长。

    // 混入 SingleTickerProviderStateMixin 使对象实现 Ticker 功能
    class _AnimatedContainerState extends State<AnimatedContainer>with SingleTickerProviderStateMixin {
      AnimationController _controller;

      @override
      void initState() {
        super.initState();
        // 创建 AnimationController 动画
        _controller = AnimationController(
          // 传入 Ticker 对象
          vsync: this,
          // 传入 动画持续时间
          duration: new Duration(milliseconds: 1000),
        );
        startAnimation();
      }

      Future<void> startAnimation() async {
        // 调用 AnimationController 的 forward 方法启动动画
        await _controller.forward();
      }

      @override
      Widget build(BuildContext context) {
        return Container(
          width: _controller.value;
          child: //...
        );
      }
    }

    AnimationController 继承自 Animation,具有一系列控制动画的方法,如可用 forward() 方法来启动动画,可用 repeat() 方法使动画重复执行,也可以通过其 value 属性得到当前值。

    1.4.1 Animation

    我们可以通过在 CurvedAnimation 传入 AnimationController 和 Curve 对象创建一个 Animation 对象,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    final Animation<double> animation = CurvedAnimation(
      parent: controller,
      curve: Curves.ease,
    );

    也可以通过调用 tween 的 animate 方法传入 controller 对象创建 Animation 对象,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    Animation<int> alpha = IntTween(begin: 0, end: 255).animate(controller);

    Animation 是一个抽象类,其中保存了动画的过程值(value)和状态,下面是四种状态类型。

    enum AnimationStatus {
      /// 动画处于停止状态
      dismissed,
      /// 动画从头到尾执行
      forward,
      /// 动画从尾到头执行
      reverse,
      /// 动画已执行完成
      completed,
    }

    AnimationController 是它的一个实现类。其内部通过范型机制可实现对各类型对象的动画,比如 AnimationAnimationAnimation 等。其另一个实现类 Curved­Animation,可以用来与 Curves 结合实现各类曲线模型函数的动画。

    Animation 另一个实现方法是调用 tween 对象的 animate 方法传入 Animation 对象创建另一个 Animation 对象,该方法可通过将使动画值定义在 tween 区间内,如下:

    AnimationController controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    final Animation curve =
        CurvedAnimation(parent: controller, curve: Curves.easeOut);
    Animation<int> alpha = IntTween(begin: 0, end: 255).animate(curve);

    1.4.5 动画监听

    Animation 对象可以有设置两种监听器,分别是帧监听器和状态监听器。使用 addListener() 添加帧监听器,使用addStatusListener()  添加状态监听器。

    只要动画的值发生变化,就会触发帧监听器的回调。通常,我们在其内部调用 setState() 来重建组件来实现动画效果,如下:

    animation = new CurvedAnimation(
            parent: animationController, curve: Curves.elasticOut)
    animation.addListener(() => this.setState(() {}))

    动画开始,结束,前进或后退时会触发 StatusListener 的回调,如下:

    animation = new CurvedAnimation(
            parent: animationController, curve: Curves.elasticOut)
    animation.addStatusListener((AnimationStatus status) {});

    2. 动画组件

    我们已经知道了 Flutter 控制动画的四大要素,其中涉及的各个概念可以帮助我们设计出各种各样的动画效果,但不免也多了一些需要重复编写的模版代码,比如,在 Animation 的帧监听器设置的监听器回调里,几乎所有场景中我们都只是调用 setState(),再比如 State 对象每次都需要我们手动地混入 SingleTickerProviderStateMixin 等等这类情况。Flutter 为了提高开发者的开发效率,提供了 AnimatedWidget 抽象类来封装这部分模版代码,其源码非常简单,如下:

    abstract class AnimatedWidget extends StatefulWidget {
      /// 该 Widget 在 listenable 状态改变后将会重建.
      ///
      /// [listenable] 为必要参数.
      const AnimatedWidget({
        Key key,
        @required this.listenable
      }) : assert(listenable != null),
           super(key: key);

      /// The [Listenable] to which this widget is listening.
      ///
      /// 一般是一个 [Animation] 或者 [ChangeNotifier] 对象.
      final Listenable listenable;

      /// 继承该方法构建依赖 listenable(当前 value 值等) 状态的 Widget.
      @protected
      Widget build(BuildContext context);

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

    class _AnimatedState extends State<AnimatedWidget{
      @override
      void initState() {
        super.initState();
        widget.listenable.addListener(_handleChange);
      }

      @override
      void didUpdateWidget(AnimatedWidget oldWidget) {
        super.didUpdateWidget(oldWidget);
        if (widget.listenable != oldWidget.listenable) {
          oldWidget.listenable.removeListener(_handleChange);
          widget.listenable.addListener(_handleChange);
        }
      }

      @override
      void dispose() {
        widget.listenable.removeListener(_handleChange);
        super.dispose();
      }

      void _handleChange() {
        setState(() {
          // 状态改变,重建 Widget.
        });
      }

      @override
      Widget build(BuildContext context) => widget.build(context);
    }

    AnimatedWidget 作为一个抽象类可供我们实现一个我们自己的具体类,其接受一个 Listenable 对象作为参数,并需要重写 build 方法。我们上一节中多次提到的 Animation 继承自 Listenable。下面的这个这个组件就是我自己实现的动画组件:

    class Sun extends AnimatedWidget {
      Sun({Key key, Animation animation})
          : super(key: key, listenable: animation);@override
      Widget build(BuildContext context) {final Animation animation = listenable;var maxWidth = MediaQuery.of(context).size.width;var margin = (maxWidth * .3) / 3;return new AspectRatio(
            aspectRatio: 1.0,
            child: new Container(
                margin: EdgeInsets.symmetric(horizontal: margin),
                constraints: BoxConstraints(
                  maxWidth: maxWidth,
                ),
                decoration: new BoxDecoration(
                  shape: BoxShape.circle,
                  color: animation.value,
                )));
      }
    }

    我们可以通过传入已经定义好的 Animation 对象来使用该组件:??

    class AnimateWidgetState extends State<AnimateWidget{
      AnimationController _animationController;
      ColorTween _colorTween;
      ...
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: 
              Column(
            children: [
              Sun(animation: _colorTween.animate(_animationController)),
            ],
          ),
        );
      }
    }

    这样我们就封装了自己的一个动画组件,另外,Flutter 内部为我们提供了多个已经封装好的动画组件,利用好这些组件可以大大地提高我们的开发效率:

    • SlideTransition
    • ScaleTransition
    • RotationTransition
    • SizeTransition

    3. 隐式动画组件

    利用动画组件我们已经可以方便地封装出一系列控件动画了,但是这种实现方式均需要我们自己提供 Animation 对象,然后通过提供的接口方法来启动我们的动画,控件的属性由 Animation 对象提供并在动画过程中改变而达到动画的效果。为了使动画使用起来更加方便,Flutter 帮助了开发者从另一个角度以更简单的方式实现了动画效果——隐式动画组件(ImplicitlyAnimatedWidget)。

    通过隐式动画组件,我们不需要手动实现插值器、曲线等对象,开发者甚至也不需要使用 AnimationController 来启动动画,它的实现方式更贴近对组件本身的操作,我们可以直接通过 setState() 的方法改变隐式动画组件的属性值,其内部自行为我们实现动画过程的过渡效果,即隐藏了所有动画实现的细节。Flutter 内部为我们提供了多个实用的隐式动画组件,我们本节分别介绍 AnimatedContainer 和 AnimatedOpacity 这两个最常用的隐式动画组件。

    3.1 AnimatedContainer

    AnimatedContainer 是我们最常使用到的隐式动画组件之一,从名字可以看出这个控件是以动画形式而成的 Contianer 控件,它们都是页面中渲染一个空的容器并且使用方法也非常相似。我们可以用下面的方式使用 Contianer 控件:

    var height = 40.0  
    ...
        
    Container(
        width: 60.0,
        height: height,
        color: Color(0xff14ff65),
      ),

    上面的代码中,我们将 Container 的高度设置为 height 变量,即为 40.0,当我们使用一个 Button 按钮触发改变 height 值的事件并且重绘界面时,Container 的高度会随之改变:

    onPressed: (){
      setState(() {
        height = 320.0;
      });
    },

    但这种变化很明显仅是属性的改变并不是一个平滑的过渡动画,然而同样的事件发生在 AnimatedContainer 控件上,便会有一个渐变的效果:

    AnimatedContainer(
      duration: Duration(seconds: 5),
      width: 60.0,
      height: height,
      color: Color(0xff14ff65),
    )

    使用 AnimatedContainer 后,我们再次触发 height 变量改变后,页面中的 AnimatedContainer 便会平滑的过渡到相应的高度,其 duration 属性用于设置动画过渡的时间,这里,我们设置为 5 秒??。

    我们可以用相同的方式为 Container 的 Color、width 等各种属性设置动画,同时也可以通过为其设置 alignment 属性来设置其内部子控件的位置。

    3.2 AnimatedOpacity

    在 Flutter 中,另一种常用的动画是控件透明度的过渡动画,其对应的隐式动画组件为 AnimatedOpacity。它的用法与 Opacity 相似,内部持有的 opacity 属性可以设置为 0.0~1.0 中的任意浮点数,分别对应完全透明与完全不透明,使用下面的方式,我们便可以设置了一个半透明的 Opacity 控件:

    Opacity(
        opacity: 0.5,
        child: Text("hello"),
    )

    我们以相同的方法使用 AnimatedOpacity:

    double opacity = 1.0;
    ...
    AnimatedOpacity(
        opacity: opacity,
        duration: Duration(seconds: 1),
        child: Text("hello"),
    )

    它也接受 duration 属性来设置过渡时间,通过改变 opacity 变量的值可以实现透明度变化的动画效果:

    setState(() {
     opacity = 0.0;
    });

    3.3 隐式动画原理简析

    我们已经在之前部分介绍了 Flutter 中的三棵重要的树及它们在组件渲染中的作用了。在元素树中,每个 Element 对象持有控件树中 Widget 组件的状态信息,这里我们将它称为 State 对象,Widget 刷新重建时,Element 会对比自己所对应 Widget 是否更新而做出相应屏幕渲染上的改变。

    在各个隐式动画组件中,其动画信息便储存在 Element 所持有的 State 对象中,Widget 每次刷新都会引起 Element 对其重新引用,当对应的 Widget 类型改变则其 Element 会连带 State 对象自然而然的需要重新渲染,然而当 Widget 类型不变,则 Element 不需要重建,只需要改变 State 对象储存的动画信息即可。这样一种连续更新属性的过程便实现了更为我们所方便使用的隐式动画。

    3.4 实现自定义隐式动画组件

    实现自定义的隐式动画组件,我们需要使用到两个类:ImplicitlyAnimatedWidget 和 AnimatedWidgetBaseState。

    ImplicitlyAnimatedWidget 是所有隐式动画组件的父类,继承自 StatefulWidget,并且仅需要接受动画曲线 curve 与动画过渡时长 duration 两个参数:

    const ImplicitlyAnimatedWidget({
        Key key,
        this.curve = Curves.linear,
        @required this.duration
      }) 

    在我们自定义的隐式动画组件可以扩充他的参数类型满足我们的需求。

    AnimatedWidgetBaseState 即 ImplicitlyAnimatedWidget 这个有状态组件所对应的 State 对象类,我们自定义的隐式动画组件所对应的 State 也必须继承该类,其内部需要重写 forEachTween 方法。

    下面就是我自己定义的隐式动画组件:

    class MyAnimatedWidget extends ImplicitlyAnimatedWidget {
      MyAnimatedWidget({
        Key key,
        this.param, //导致动画的参数
        Curve curve = Curves.linear,
        @required Duration duration,
      }) :super(key: key, curve: curve, duration: duration);
      final double param;
      
      @override
      _MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
    }

    class _MyAnimatedWidgetState extends AnimatedWidgetBaseState<MyAnimatedWidget{
      Tween<double> _param; // State 内部保存的当前状态信息,类型为 Tween
      
      @override
      void forEachTween(TweenVisitor<dynamic> visitor) {
        _param = visitor(_param, widget.param, (value) => Tween<double>(begin: value));
      }
      
      @override
      Widget build(BuildContext context) {
        //return a widget built on a parameter
      }
    }

    上面代码中,我们在父类的基础之上拓展了 param 参数,它是我们在动画过程中需要关注的动画属性值。我们还需要重点关注 _MyAnimatedWidgetState 类中 forEachTween 方法,它是隐式动画实现的核心方法,其用于每次更新组件的动画属性,接受一个 TweenVisitor 对象 visitor 作为参数。visitor 同时接受是那个参数,第一个为一个插值器对象 Tween,其是应用在属性中的插值器当前补间值,第二个参数为一个 T 类型的值,即新的目标属性值,第三个参数为一个回调函数,用于配置给定的 value 值作为新的插值器开始值。TweenVisitor 函数返回一个 Tween 对象,我们将其赋值给组件中当前的插值器对象作为下次调用 forEachTween 方法时的当前值。

    按照以上原理,我们就完成自己的隐式动画组件了。

    相关推荐:Flutter原理:三棵重要的树END

    技术交流,欢迎添加我的微信:MeandniBlog

    509e3de301ff35604cdde0a5afe9bfb8.png

    展开全文
  • PPT中的动画都有四种基本属性,透明度、位置、旋转、比例。不同属性对应了不同的动画。只要掌握了这四种属性,就会发现,看起来超酷炫的动画其实也是多个简单动画组合而成。可以说,只要你有足够脑洞,没有做...
    b6a72448dda1a9a73a22f6c1630f9765.png

    新手往往对PPT动画感到吃力,不知道怎么做。其实动画入门并不难。PPT中的动画都有四种基本属性,透明度、位置、旋转、比例。不同的属性对应了不同的动画。只要掌握了这四种属性,就会发现,看起来超酷炫的动画其实也是多个简单动画组合而成的。
    可以说,只要你有足够的脑洞,没有做不出的动画!

    4b1041924a79faaf69547e148ed9875a.png

    虽然有这么多动画供我们选择,但是在日常制作PPT时,我们并不会用到全部动画效果。使用动画辅助是为了更好地表达我们想展示的内容,恰到好处的动画效果,才能够起到锦上添花的作用。

    那么现在我们先来大致熟悉下PPT动画的基本属性,只有了解动画的内在逻辑,我们才能更好地运用PPT动画。

    PPT动画有无数个组合,但是却逃脱不了这四个基本属性——透明度、旋转、比例、位置。

    下面我们来一一详细解析PPT内置动画具体哪些包含了以上四个基本属性。

    9479ff49ca5eecce61c0e0f802fa5ca1.png

    1.透明度。我们在动画卡里面会看到两个非常典型的动画,进入中的淡化和退出中的淡化,主要都是透明度的变化。还有如进入栏中:出现、飞入、浮入、劈裂、擦除、形状、轮子、随机线条、旋转、弹跳等动画;退出栏中:飞入、浮入、劈裂、擦除等动画,这些动画效果都涉及到了透明度的变化。

    2.旋转。典型的动画就是“强调”一栏中的陀螺旋动画了,还有如进入栏中:翻转式由远到近、旋转、回旋、中心旋转等动画;强调栏中:跷跷板、弹跳动画;退出栏中:收缩并旋转、旋转、回旋、中心旋转等动画,这些都有加入旋转的属性。

    3.比例。最典型的动画要数“强调”一栏中的放大/缩小动画,还有如进入栏中:缩放、基本缩放、压缩动画;强调栏中:放大/缩小动画;退出栏中:缩放、基本缩放、压缩动画,都是有比例上的变化。

    4.位置。最具有代表型的非“动作路径”一栏莫属。我们可以对对象绘制不同的运动轨迹,通过改变其位置来实现我们所要达到的演示效果。具体如动作路径栏中:梯形路径、弹簧路径、向上路径、向左/右路径,十字形扩展路径等路径动画。

    a60639ba83f1e7d5b9076e677ff71757.png

    只要你对这四个动画的基本属性了然于心,那么就能够掌握几乎全部的PPT动画,简而言之,如果你以后看见一个动画,如果可以将其拆成这四个基本动画属性,也就可以用PPT来实现了!

    我们来举个例子来看看:

    aae9b457517797886db06f2995ca5750.gif

    这是一个信封打开的动画,从信封里冒出来一个倒立的小人。素材的选择就不细说了,我们来详细看看动画部分到底是怎么做出来的。

    9999bb21690752d35bd2d7f040ca8fe0.png

    可以看到右侧的动画窗格,运用了陀螺旋动画、出现动画、伸展动画、路径动画,通过这些简单动画的组合,可以达到一个不错的动画效果。

    首先是信封进入的动画,其效果是从左边旋转了半圈然后出现在画面中间,用到了我们之前讲过的改变陀螺旋的中心点,这里是典型的旋转。

    然后是信封打开的效果,是在原图形上重新制作了一个一样的信封,因为找到的信封素材不是分离的,没有打开的那一半封口,所以我们自己制作一个封口。先设置好同样的信封图形出现在固定的位置,这里用到的任意多边形三角形和圆角矩形制作信封,然后上半部信封开口是三角形 这个三角形为了让它展示出信封打开的过程,选用了伸展动画,这属于比例变化。

    最后是一个小人从信封中冒出来,这是简单的路径动画,位置变化产生的效果。

    由以上几个部分组成的动画就呈现出上面动图的样子,只看动图会认为是一个完整的动画,当拆解后就会发现都是由简单的4个元素组成的。

    这里,我把我经常用的一些动画列出来,大家可以借鉴参考下。

    5fb5ef0de0bafd15d793b53e35d42c4b.gif
    a99faf97ab5f422e62c13e73a7ed0d6f.gif
    5d064d490cf257e693dcae1fb7239620.gif

    那么在学完上面的动画基本属性后,我再给大家介绍4个制作动画最常用的快捷键,是非常实用的快捷方式,这个小技巧可以帮助你大大提升动画设计效率。我们一起来看下吧!

    四大高效快捷键

    (1)F4 :重复上一个步骤。当我们要复制多个对象时,可以使用这个快捷键。

    (2)Ctrl :当按住Ctrl,并且拖动鼠轮,我们可以快速地放大画面,这样便于我们进行更加精细的调整对象;当按住Ctrl,并且按住鼠标左键进行拖动,可以快速复制同一对象;当我们编辑形状的时候,按住Ctrl可以添加编辑点。

    (3)Alt :如果你打开了智能参考线,那么当你在进行精细编辑某对象的时候会造成一定的干扰,按住Alt就可以摆脱参考线的智能吸附。

    (4)Shift :方便进行路径的水平或垂直移动,便于动画窗格的连选。

    最后我用一张图来总结下刚刚的知识点:

    65ac95eed0747879342fdc0024b251f4.png

    你学会了吗?

    (信息来源:ppt优秀教程)

    展开全文
  • 只有对工业产品本身有着深刻理解,才能更好的将工业产品展示出来,准确无误是工业动画的基本要素。 根据行业以及客户的基本需求,快速定位客户的真正需求,充分理解客户的产品,为客户量身定制解决方案,让工业动画...
  • PPT中的动画都有四种基本属性,透明度、位置、旋转、比例。不同属性对应了不同的动画。只要掌握了这四种属性,就会发现,看起来超酷炫的动画其实也是多个简单动画组合而成。我们知道在PPT动画一栏中,系统预设了...
  • HTML 动画模块

    2019-11-29 21:15:14
    动画模块 动画模块与过渡模块相同点 ...动画模块的基本使用 /*动画要素:*/ /*(1)告诉系统哪个属性需要执行动画:*/ animation-name:动画名称; /*(2)告诉系统我们需要创建一个名字叫动画名称的动...
  • 动画效果运动的物体总是能最有效的吸引住人类的...其他所有的动画基本上都是这些单一的动画,或者多个动画的叠加。例如,一边平移一遍放大。动画由两个要素:一个是上面各种动画体现出的空间变化;另一个就是动画相对于
  • Flash格斗动画的动作设计和动作的制作2007-11-01 23:00:42 来源:闪吧 justsolo■第一课:理论基础 首先我们要先确立对象,我们的对象是格斗的动作设计,以及动作的动画制作,不需要多余的场景,不需要多余的噱头,把握好...
  • IOS UILabel 、帧动画

    2015-12-23 08:49:44
    UILabel 、创建帧动画 1、UIlabel以及它的一些基本属性 2、UIImageView 3、创建帧动画的要素
  • iOS 动画

    2016-02-16 14:59:15
    本文着重介绍Core Animation层的基本动画实现方案。 在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下: 演员--->CALayer,规定电影的主角是谁 剧本--->...
  • 动画是让人们深刻理解数学原理的关键要素,在上一章中已经介绍manim库的基本使用以及静态元素的绘制。本章主要介绍在各种场景下动画的应用以及效果展示。 1、引导动画 %%manim PointMovingOnShapes -ql -v ...
  • CSS- 动画模块

    2020-11-20 10:59:36
    过渡和动画都是用来给元素添加动画的。 过渡和动画都是系统新增的一些属性。 过渡和动画都需要满足三要素才会有动画效果。 代码示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset...
  • 本文实例讲述了JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果。...已经具备了游戏的基本要素,扩展一下可以变成一个不错的 HTML5 游戏。 演示效果如下: 完整代码如下: <!DOCTYPE html> <...
  • 一个精美又吸睛PPT动画,包含图片、音乐、动画效果三个基本要素,播放时就是一个非常棒视频效果。下面也将从这3个方面,教大家用数码大师,快速制作一个开场效果精美PPT动画,而且小白也能很快上手学会。赶紧...
  • Css3动画(animation)

    2020-07-27 18:58:57
    在 CSS3 出现之前,动画都是通过 JavaScript 动态改变元素样式属性来完成了,这种方式虽然能够实现动画,但是在性能上存在一些...满足以下3点,就能看到最基本的动画效果了。 动画要素: 需要执行哪个动画(anima
  • 重学CSS-09-过渡动画

    2021-05-13 19:02:36
    动画的定义和调用 一、过渡 1. 过渡的基本使用 transition过渡: transition过渡属性是CSS3的特性,过渡可以为一个元素在不同样式之间变化自动添加“补间动画” 兼容性: 过渡从IE10开始兼容,移动端兼容良好。 ...
  • core Animation动画

    2015-06-25 14:39:00
    本文着重介绍Core Animation层的基本动画实现方案。 在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下: 演员--->CALayer,规定电影的主角是谁 剧本-...
  • 视图UIView动画

    千次阅读 2015-12-26 20:16:50
    本文着重介绍Core Animation层的基本动画实现方案。在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下:演员--->CALayer,规定电影的主角是谁 剧本--->...
  • osgAnimation之作用对象

    千次阅读 2016-05-31 21:11:32
    在前文osgAnimation之动画基础篇中介绍了osgAnimation中的几个基础的类元素,这其中Channel频道类集成了关键帧、插值算法、采样器、执行对象(Target),构成了动画的基本要素。如何将这些要素应用到场景动画之中呢,...
  • CSS过渡与动画

    2021-03-29 20:37:40
    过渡的基本使用 transition过渡可以为一个元素在不同样式之间自动添加“补间动画” transition属性四要素 transition:width 1s linear 0s; /*要过渡的属性 过渡时间 线性过渡 延迟时间*/ transition:top 1s ...
  • Web前端-css3_4--3D动画

    2020-02-21 22:17:02
    3D动画 基本引入 必须的两个要素 1 动画名 animation-name 2 动画的执行时间 animation-duration: 2s; div:hover { /*1 动画名 */ an...
  • 本文着重介绍Core Animation层的基本动画实现方案。 在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下: 演员--->CALayer,规定电影的主角是谁 剧本--->...
  • 1、过渡与动画的异同 (1)不同:过渡需人为触发才会执行;动画不需人为触发就可执行 (2)相同:都是用来给元素添加动画的;都是系统新增的一些属性;都需满足三要素才会有动画效果 2、三要素: (1)告诉系统需...
  • 精品文档 Flash 动画制作校本课程纲要 从总体上看 1首先从框架上来讲 符合校本课程的基本要素 一般项目 课程目标目标课程的内容课程的实施与评价 2 观点新颖内容翔实全面可操作性强能调动起学生的 积极性培养他们的...
  • 网站本质就是形式主义,内容、功能、表现这三个网站的要素,低保真原型解决了基础内容层面问题,而高保真线框图规划了网站功能和表现;内容是网站最基本最重要核心,因此高保真原型必须建立在低保真原型...
  • 本文整合了Core Annimationce层的基本动画实现方案。 在iOS中,展示动画可以类比于现实生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下: 演员—–>CALayer, 规定电影的主角是谁 剧本—...
  • 一、场景与动画 ...动画有几个基本要素(时间控制,状态切换,事件触发)。 下面举一个天猫场景: 一只蝴蝶出现引起了小猫注意,小猫慢慢跟随蝴蝶靠近屏幕边缘,最后被莫名其妙拉到了可视区域...
  • 一, 基于Core Animation层的基本动画实现方案。 在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下: 演员--->CALayer,规定电影的主角是谁 剧本--->...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
关键字:

动画的基本要素