• 2008-12-22

    解密PowerPoint动画之时间线 - [PPT动画探索]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/pptaddins-logs/32797872.html

    解密PowerPoint动画之时间线篇

    要讲清PowerPoint的时间线,不是一件容易的事情。当我决定要写它的时候,竟有点不知从哪里下笔,因为它实在是太过抽象化了。

    在阐述PowerPoint时间线之前,我想先讲讲动画与时间的关系。时间是形成动画的基础,所有动画总是表现为对象随时间的变化而不断改变位置,变幻颜色、变化形状等。时间掌握是动画工作的重要组成部分,它赋予动作以“意义”,如动作的快慢、轻重、加速减速……都会使动画产生力感,这样的动画看起来才更真实形象,更能体现动画对象的原始特性。如果您想了解这方面的知识,不妨去看看哈罗德.威特克和约翰.哈拉斯的书《动画的时间掌握》。

    PowerPoint动画与Flash动画最大的不同就在于它们对时间线的操作,Flash以时间为中心来调配对象,所以它提供了更多的基于时间的特性,你可以自由地在时间线上跳转,非常灵活。而PowerPoint是以对象为中心来调配时间的,所以它是一种对象专用型时间线,每个效果、每个动作都有它的专用性时间线,我们可以把这些专用型时间线称为子时间线,所有子时间线统一于整个幻灯片的主时间线:TimeLine。

    PowerPoint动画时间线的这种专用特性和silverlight是一致的,这种专用特性虽不够灵活、专业,但也有它的自己的优势。PowerPoint通过一个叫做Timing的对象让我们来操纵这种专用性时间线,它所提供的参数可以设置对象的效果或动作的动画开始,动画速度,动画时间以及动画的加速减速等等。

    图中的红色块是应用于对象上的效果在主时间线上的分布,每个效果都有一个专用时间段,这个时间段可以任意调配长短,与其他的效果没有关系,PowerPoint自定义动画工具的“高级日程”或“计时”选项提供了对效果时间线的简单控制。每个效果中包含了一个或多个叫做“动作”的东西,而每个动作也有自己的专用时间线,它是属于效果时间线上的一段时间。

     

    上图中的Effect包含了5个动作,这5个动作共享Effect的时间线。

    Effect动作动作动画时间(秒)动作延迟(秒)Effect动画时间
    A0.501秒
    B0.50
    C0.50
    D0.50.5
    E0.50

    上表中A、B、C、E动作同时动画,时间为0.5秒,动作D被延迟了0.5秒,所以整个的Effect的动画时间为1秒。而这种对动作时间的准确控制在PowerPoint自定义动画工具中是不公开的,这就制约了PowerPoint动画的灵活性,所以如果你能对Effect中的每个动作的时间线进行设置,当然就有了更多的自由和想象。

    前面我们讲到PowerPoint的Effect和动作的专用时间线都是由一个叫做Timing的对象来控制的,Timing共有14个参数,这些参数可以让我们尽可能地控制对象在时间线上的动画顺序,加速或减速等。下表列出了它们。

    Accelerate 返回或设置 Single 变量,它代表加速过程持续时间的百分比。例如,数值 0.9 意味着动画将在前 90% 的时间内逐渐加速到默认速度,并在最后 10% 的时间内保持默认速度。可读写。
    AutoReverse 设置或返回一个 MsoTriState 常量,该常量代表是否将某个效果在正向播放结束后进行反向播放,从而使播放时间增加一倍。可读写。
    Decelerate 设置或返回Single 类型值,该值代表减速过程持续时间的百分比。例如,数值 0.9 表示减速过程以默认速度启动,经过动画持续时间的 10% 之后开始减速。可读写。
    Duration 返回或设置 Single 数值,该值代表以秒为单位的动画长度。可读写。
    RepeatCount 设置或返回一个 Long 类型的值,该值代表动画要重复的次数。可读写。
    RepeatDuration 设置或返回一个Single 类型的值,该值代表重复动画应持续的时间(以秒为单位)。可读写。
    Restart 设置或返回一个 MsoAnimEffectRestart 常量,该常量代表动画效果启动一次后是否会重新启动。可读写。
    RewindAtEnd 设置或返回一个 MsoTriState 常量,该常量代表动画结束后对象是否返回其初始位置。可读写。
    SmoothEnd 设置或返回一个 MsoTriState 常量,该常量代表动画结束时是否应该减速。可读写。
    SmoothStart 设置或返回一个 MsoTriState 常量,该常量代表动画启动时是否应该加速。可读写。
    Speed 返回或设置一个Single 类型值,该值代表指定动画的速度(以秒为单位)。可读写。
    TriggerDelayTime 设置或返回一个Single 类型的值,该值代表启用动画触发器后的延时(以秒为单位)。可读写。
    TriggerShape 设置或返回一个 Shape 对象,该对象代表与动画触发器相关联的形状。可读写。
    TriggerType 设置或返回一个 MsoAnimTriggerType 常量,该常量代表启动动画的触发器。可读写。

    这14个参数中,需要我们重点关注的有:

    Duration属性,它用来确定Effect或动作的动画时间,当时间线达到其持续时间的终点时,表示时间线完成了一次重复,其最大值为863990秒。

    AutoReverse属性指定时间线在到达其Duration的终点后是否倒退。如果将此动画属性设置为true,则动画在到达其Duration的终点后将倒退,即从其终止值向其起始值反向播放,这样会花去双倍的时间,默认情况下,该属性为false。

    RepeatCount属性指定时间线Effect或动作的播放次数。默认情况下,时间线的重复次数为1.0,即播放一次时间线,不进行重复,它的最大值为9999次。

    TriggerDelayTime属性表示Effect或动作延迟多少秒开始动画。通过它可以调整Effect或动作在时间线上动作开始播放的时间,从而确定它们的播放顺序,这与Effect或动作在序列中的索引没有关系。

    下面我们来看看微软工程师在PowerPoint预定义动画“光速”当中的动作与时间设置:

     

    “光速”共由五个动作构成:

    • 设置动作:这里用于表示开始动画时对象显示在屏幕上。
    • 属性动作:设置对象的X坐标。
    • 属性动作:设置对象的倾斜度。
    • 缩放动作:设置对象的放大或缩小。
    • 属性动作:设置对象的X坐标。

    这五个动作动画的顺序与它们在列表中的索引是没有关系的,动画顺序受TriggerDelayTime属性控制,TriggerDelayTime为0的Effect或动作是同时开始动画的,设置了TriggerDelayTime属性的Effect或动作会根据其所设值进行延迟播放,下面是“光速”中各动作的时间线信息:

     

         属性动作:对象X坐标                                   属性动作:对象倾斜度

     

        缩放动作                                             属性动作:对象X坐标

    由上图中我们可以看出“光速”效果中各动作的时间线参数设置:

    光速动作动画时间(秒)延迟(秒)是否反转光速总动画时间
    设置0.00100.6+0.2*2=1秒
    属性:X0.60
    属性:倾斜0.20.6
    旋转0.20.6
    属性:X0.20.6

    如果你改变了“光速”效果的动画长度,那么其中的各个动作(除设置对象可见性之外)都会按照它动画时间的百分比进行递增或递减,下表反映了把光速的总动画时间改变为3秒后各动作的变化情况:

    光速动作动画时间(秒)延迟(秒)是否反转光速总动画时间
    设置0.001(不变)0(不变)3秒
    属性:X1.80
    属性:倾斜0.61.8
    旋转0.61.8
    属性:X0.61.8

    细心的你也许已经开始对上面图中一些有趣的符号产生兴趣,如:From、To、Property、(#ppt_w/2)、(#ppt_x)。是的,当这些符号开始呈现在我面前的时候,我也有些吃惊,我不知道#是什么意思,不知道ppt_w到底代表了多长的宽度,不知道ppt_x是一个变量还是常量,所有的这一切变得神秘起来。

    我只能忍不住地继续探索下去,直到我完全揭开它们的面纱为止。

    分享到:

    评论

  • 请问博主这篇文章里使用的那个工具是什么啊?很是喜欢,我现在正在研究Powerpoint里的VBA呢,现在在2010里微软不提供录制宏了,不好研究了。
  • 您好,看了您的文章收获甚丰,有个问题想请教下:动画对象有没有控制开始播放和停止播放(中途)的方法呢?我想通过VBA代码控制动画的播放和停止。
  • 谢谢你的讲解!
    我简单的更改E前面的两个参数,知道他们是控制横纵向的位移的。
    是否可以将他的源代码发给我hxhgxytiger@gmail.com?
  • 我终于弄出来了,代码还是不贴出来了。
  • Sub AddMotionPath()

    Dim shpNew As Shape
    Dim effNew As Effect
    Dim aniMotion As AnimationBehavior

    Set shpNew = ActivePresentation.Slides(1).Shapes _
    .AddShape(Type:=msoShape5pointStar, Left:=0, _
    Top:=0, Width:=100, Height:=100)
    Set effNew = ActivePresentation.Slides(1).TimeLine.MainSequence _
    .AddEffect(Shape:=shpNew, effectId:=msoAnimEffectCustom, _
    Trigger:=msoAnimTriggerWithPrevious)
    Set aniMotion = effNew.Behaviors.Add(msoAnimTypeMotion)

    With aniMotion.MotionEffect
    .Path = "M 0 0 L -0.25 0 E"
    End With

    End Sub
    这是Shyam Phillai写的代码,path的常量是如何设置的?帮助里面说它是只读的,为啥这里又可以写入?
    回复hxhgxy说:
    在PPT动画中,Path符合VML语言规范。M(m)表示移动坐标点,L(l)表示画一直线,C(c)表示贝塞尔曲线的控制点,E表示画线结束等,在VML中点的坐标是以像素为单位的,而在PPT则是以逻辑单位来表示,当然,也可以写一个转换函数把逻辑单位转换成像素单位。
    Path对于应用程序和演示文稿来说是只读的,对于MonitionEffect来说是可读写的,PPT帮助文档中没有说清楚,但是在对象浏览器中可以看得很清楚。
    Shyam Phillai写了一个关于路径合并和单位转换的工具,我有他的源代码,如果有获准,我将把它整合到我的工具中。
    2009-08-25 19:01:00
  • 老乡,如何控制behavior的时间线?
    下述代码为什么不工作?

    Sub FireWork()
    Dim shpFireWork As Shape
    Dim slTemp As Slide
    'Dim vShow As View
    Dim effTemp As Effect
    Dim bhvEff As AnimationBehavior
    Dim ptTemp As AnimationPoint

    Set slTemp = Application.ActivePresentation.Slides(2)
    With slTemp
    Set shpFireWork = .Shapes("FireWork")
    Set effTemp = .TimeLine.MainSequence.AddEffect _
    (Shape:=shpFireWork, _
    effectId:=msoAnimEffectCustom)
    With effTemp.Timing
    .Duration = 3
    .TriggerType = msoAnimTriggerWithPrevious
    .TriggerDelayTime = 0
    .RepeatCount = 30
    .RepeatDuration = 300
    .Restart = msoAnimEffectRestartAlways
    End With
    'First action is to scale small
    Set bhvEff = effTemp.Behaviors.Add(msoAnimTypeScale)
    bhvEff.Accumulate = msoAnimAccumulateAlways
    With bhvEff.Timing
    .Duration = 0.5
    .TriggerDelayTime = 0
    End With
    With bhvEff.ScaleEffect
    .FromX = shpFireWork.Width
    .FromY = shpFireWork.Height
    .ToX = .FromX * 0.02
    .ToY = .ToX * 0.02
    ' .ByX = 0.02
    ' .ByY = 0.03
    End With
    'Second action is to move up, happen after the first one
    Set bhvEff = effTemp.Behaviors.Add(msoAnimTypeMotion)
    bhvEff.Accumulate = msoAnimAccumulateAlways
    With bhvEff.Timing
    .Duration = 1.5
    .TriggerDelayTime = 0.5
    End With
    With bhvEff.MotionEffect
    .FromX = shpFireWork.Left
    .FromY = shpFireWork.Top
    .ToX = shpFireWork.Left
    .ToY = shpFireWork.Top - 100
    End With
    'Third action is to enlarge, happen after the second action
    Set bhvEff = effTemp.Behaviors.Add(msoAnimTypeScale)
    bhvEff.Accumulate = msoAnimAccumulateAlways
    With bhvEff.Timing
    .Duration = 1
    .TriggerDelayTime = 2
    End With
    With bhvEff.ScaleEffect
    .ByX = 1000
    .ByY = 1000
    End With
    'Fourth action is to dissolve out, happen together with the third one
    Set bhvEff = effTemp.Behaviors.Add(msoAnimTypeFilter)
    With bhvEff.Timing
    .Duration = 1
    .TriggerDelayTime = 2
    End With
    With bhvEff.FilterEffect
    .Type = msoAnimFilterEffectTypeDissolve
    End With
    End With
    End Sub