zoukankan      html  css  js  c++  java
  • Delphi XE2 之 FireMonkey 入门(13) 动画(下)


    TAnimation 类的主要成员:
    protected
      function NormalizedTime: Single;      //
      procedure ProcessAnimation; virtual;  //其子类们主要通过覆盖此方法来实现不同的动画
      procedure Loaded; override;           //
    public
      procedure Start; virtual;             //播放
      procedure Stop; virtual;              //停止
      procedure StopAtCurrent; virtual;     //停止在当前帧; 和 Pause 属性不同的是它会触动 OnFinish 事件
      procedure StartTrigger(...); virtual; //如果不是覆盖, 一般应使用 Trigger、TriggerInverse 属性而不是该方法
      procedure ProcessTick(...);           //内部使用的动画执行方法, 主要由它来调用 ProcessAnimation 过程.
      property Running: Boolean ...;        //是否运行中; 只读
      property Pause: Boolean ...;          //暂停
    published
      property AnimationType: TAnimationType ...;     //动画类型; 它好像只影响到插入(Interpolation)算法
      property AutoReverse: Boolean ...;              //自动逆向(起点->终点->起点)
      property Enabled: Boolean ...;                  //是否可用
      property Delay: Single ...;                     //延迟多少秒再开始动画
      property Duration: Single ...;                  //动画长度(秒); 其子类一般会默认为 0.2
      property Interpolation: TInterpolationType ...; //动画插入类型; 通过此选项可实现像反弹等多种动画效果(很好玩)
      property Inverse: Boolean ...;                  //逆向动画(终点->起点)
      property Loop: Boolean ...;                     //循环播放
      property Trigger: TTrigger ...;                 //指定可触发动画的事件; 其值是个字符串(见下表)
      property TriggerInverse: TTrigger ...;          //指定可触发逆向动画的事件; 其值是个字符串(见下表)
      property OnProcess: TNotifyEvent ...;           //每个动画帧触发的事件
      property OnFinish: TNotifyEvent ...;            //停止时触发的事件
    end;
    
    { Trigger、TriggerInverse 属性的可选值: }
    'IsMouseOver=true'
    'IsMouseOver=false'
    'IsFocused=true'
    'IsFocused=false'
    'IsVisible=true'
    'IsVisible=false'
    'IsDragOver=true'
    'IsDragOver=false'
    'IsOpen=true'
    'IsOpen=false'
    


    TFloatAnimation 用于尺寸变化的动画;
    TColorAnimation 用于颜色变化的动画;
    TGradientAnimation 用于颜色梯度动画;
    TRectAnimation 用于边界(Padding、Margins)动画; 它们的扩展属性是一样的(但参数类型不一样):
    StartValue       //起点值
    StopValue        //终点值
    StartFromCurrent //是否从当前帧开始动画
    PropertyName     //动画要控制的属性; 其值是个字符串(见下表)
    
    { PropertyName 常用取值: }
    'Width'
    'Heigth'
    'StrokeThickness'
    'Position.X'
    'Position.Y'
    'Scale.X'
    'Scale.Y'
    'RotationCenter.X'
    'RotationCenter.Y'
    'RotationAngle'
    'Opacity'
    'Margins.Left'
    'Margins.Top'
    'Margins.Rigth'
    'Margins.Bottom'
    'Padding.Left'
    'Padding.Top'
    'Padding.Rigth'
    'Padding.Bottom'
    
    'Fill.Color'
    'Stroke.Color'
    
    'Fill.Gradient'
    'Stroke.Gradient'
    
    'Margins'
    'Padding'
    


    TFloatKeyAnimationTColorKeyAnimation 可通过其 Keys 属性定义多个关键帧(前面几种都只有两个关键帧), 其属性扩展:
    Keys             //TKeys 类型的集合, 元素类型是 TKey; 主要使用 TKey.ID(关键帧序号)、TKey.Key(参数值) 两个属性
    PropertyName     //
    StartFromCurrent //
    


    TBitmapAnimation 用于两张图片的切换动画; 它的扩展属性有:
    StartValue   //起点图片
    StopValue    //终点图片
    PropertyName //只能是 'Bitmap'
    


    TBitmapListAnimation 只需要一张图片, 根据需要的动画帧数(AnimationCount)把图片均分, 然后让切分后的各部分连成动画; 它的扩展属性有:
    AnimationCount  //动画帧数
    AnimationBitmap //图片
    PropertyName    //
    


    TPathAnimation 可以让对象绕一个指定的路径运动; 它的扩展属性有:
    Path: TPathData; //路径数据; 一般通过 TPathData.Data 读写数据, 数据(字符串)使用了 SVG 中 Path 的格式标准
    Rotate: Boolean; //是否旋转(自转)
    


    路径动画简单示例: 先在 HD 窗体上放置一个 TRectangle, 选定后给它添加一个 TPathAnimation; 测试代码:

    const
      strPath = 'M 3.84500002861023,3.47300004959106 ' +
        'C 4.83799982070923,24.6110000610352 26.2040004730225,34.9749984741211 42.875,30.8320007324219 ' +
        'C 69.8730010986328,24.121000289917 82.1620025634766,-9.76099967956543 74.6009979248047,-37.4169998168945 ' +
        'C 63.992000579834,-76.2160034179688 23.7210006713867,-93.3140029907227 -9.33600044250488,-80.4909973144531 ' +
        'C -52.2709999084473,-63.8380012512207 -70.8339996337891,-8.08600044250488 -55.2200012207031,37.6059989929199 ' +
        'C -35.9000015258789,94.1429977416992 24.3759994506836,118.28099822998 73.6240005493164,96.3960037231445 ' +
        'C 132.567993164063,70.2020034790039 157.505996704102,-7.92000007629395 133.664993286133,-71.5500030517578 ' +
        'C 105.81600189209,-145.880996704102 25.3040008544922,-177.113998413086 -40.0859985351563,-146.054992675781 ' +
        'C -95.6880035400391,-119.646003723145 -129.975997924805,-55.0750007629395 -127.064002990723,11.4790000915527';
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PathAnimation1.Path.Data := strPath;
      PathAnimation1.Duration := 8;
      PathAnimation1.AutoReverse := True;
      PathAnimation1.Loop := True;
      PathAnimation1.Rotate := True;
      PathAnimation1.Enabled := True;
    end;
    
    { 如果要把路径显示出来, 还需要使用 TPath, 它是专用于呈现路径数据的. }
    


    另外: 动画应该可以叠加和嵌套的, 暂不再深究.

    还有, 真的在实用时, 使用这些类恐怕不如直接使用 FMXObject 中的方法来得便宜, 如:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Button1.AnimateFloat('Position.X', Button1.Position.X*2, 1.5);
    end;
    

  • 相关阅读:
    突然又想起了这首诗
    安装使用Androidx86打造快速流畅的Aandroid开发环境!
    解决电脑没插网线虚拟机无法桥接到主机
    使用WordPress更新通知服务,让搜索引擎知道你更新了,加快收录。
    php+apache+mysql环境配置时apache服务不能开启的解决
    WordPress备份的七种办法
    怎么在网站中正确使用JQuery代码
    如何让自己的博客在各搜索引擎中被搜索出来与快速收录
    轻松查看文件被哪个进程使用
    解密QQ非会员漫游聊天记录
  • 原文地址:https://www.cnblogs.com/del/p/2191669.html
Copyright © 2011-2022 走看看