文档章节

Delphi XE2 之 FireMonkey 入门(13) - 动画(下)

涂孟超
 涂孟超
发布于 2014/09/26 15:33
字数 905
阅读 11
收藏 0

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;

本文转载自:http://www.cnblogs.com/del/archive/2011/09/26/2191669.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
Delphi XE2:这就是我们所期待的Delphi吗?

版权声明:本文为 OSChina.NET 原创编译 转载务必注明出处,并保留链接! 作者:蒂姆.安德森 Delphi是被一些人遗忘了的快速应用程序开发工具,但它与可视组件库相结合,依然是开发Windows本机...

虫虫
2011/10/31
40.4K
49
PostgreDAC 2.8.0,Delphi的PostgreSQL组件

PostgreDAC 2.8.0 发布了,该版本首次通过 RAD Studio XE2 支持 Mac OS X 系统,大大提升了 FireMonkey 支持,修复了关于 TPSQLMonitor 的 bug。 完整改进记录: [!] FireMonkey and cross p...

红薯
2012/03/20
662
1
Delphi XE2 新功能:LiveBindings --- 把对象之间的属性绑定起来

Delphi XE2 新功能:LiveBindings --- 把对象之间的属性绑定起来日期:2011年9月9日 作者: 人气:5340 查看:[大字体 中字体 小字体] XE2 有了 FireMonkey 框架,它不同于 VCL ,以往的数据感...

vga
2016/08/09
17
0
最全面的常用Delphi第三方控件汇总—报表、图表、界面、数据库等

有网友问我常用Delphi第三方控件及功能。我先大概整理一下,以后会在文章里面碰到时再仔细介绍。 报表图表方面: TeeChart Pro 在delphi 的图形显示方面目前唯一的选择,虽然从delphi 3 就随...

Leamontea
2012/12/03
0
2
PostgreSQL的Delphi组件--PostgreDAC

PostgreDAC 是适合 Delphi/C++ Builder 操作 PostgreSQL 数据库的功能非常强大的组件包,允许你创建直连 PostgreSQL 数据库的 Delphi/C++ Builder 应用,无需 BDE 和 ODBC 支持。 使用 Post...

匿名
2012/03/20
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
30分钟前
0
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
1
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
78
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
3
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部