附图的详细说明
所描述的图形用户界面结构包括动画***、属性***和显示元素组织结构。这些组件联合支持图形用户界面显示元素的基于属性的动画,甚至支持非显示值。这个所揭示的动画结构包括动画***,该动画***包括动画类、界面和收集,它们促进创建和跟踪附属于各种图形显示(和非显示)元素(例如,图标、对话框、滚动条等)的动画实例,以实现这些元素所需的动画行为。通过更改这些显示元素的属性值,来实现为这些显示元素动画化。在本发明的实施例中,由从动画类中被例示的并被附属于该属性的动画对象来驱动对属性值的变化。
在本发明的实施例中,通过使动画收集与元素树内的特定元素上的呈现操作相关联,来实现图形的动画制作。一旦最初绘制动画元素,该呈现***就根据动画行为并按时间间隔来更新该元素的显示状态,该动画行为由从规定的动画类中被例示的动画对象的组件来加以定义。
在本发明的实施例中,在具有不同的刷新周期的图形显示***中的多个层次处指定动画制作。按相对较高的刷新率来更新某些容易计算的动画。按相对较低的刷新率来更新其他更加复杂的动画(例如,影响其他图形显示对象的动画)。
当被视作整体时,这里所描述的该动画结构提供高度灵活的平台,用于执行各种新的动画行为,并将这些新的行为附属于显示元素,以创建新的、非常吸引人的动画显示界面。
作为例示,图1描绘了用于执行具体表现本发明的该动画结构的合适的操作环境100的例子。操作环境100只是合适的操作环境的一个例子,它并不意在对本发明的使用或功能性的范围提出任何限制。可能适用于本发明的众所周知的计算机***、环境和/或配置包括(但不局限于)个人计算机、服务器计算机、膝上型/便携式计算设备、手持计算设备、多处理器***、基于微处理器的***、网络PC、小型计算机、大型计算机、包括以上任何***或设备的分布式计算环境,以及类似物。
在正由计算机执行的计算机可执行指令(例如,程序模块)所实行的一套步骤和过程的一般上下文中描述本发明。通常,程序模块包括执行特殊任务或实施特殊的抽象数据类型的例行程序、程序、对象、组件、数据结构等。虽然参照在单一计算机***上被局部执行的过程来描述该示范实施例,但是,本发明潜在地被加入在分布式计算环境中进行操作的网络节点内,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块通常位于包括记忆存储设备的本地计算机存储介质和远程计算机存储介质中。
继续参照图1,用于执行本发明的示范***包括采取计算机110的形式的通用计算设备。计算机110的组件可以包括(但不局限于)处理单元120、***存储器130和***总线121,***总线121将包括该***存储器的各种***组件耦合到处理单元120。***总线121可以是几种类型的总线结构(包括存储总线或存储控制器、***总线和使用各种总线构造中的任何总线构造的局域总线)中的任何总线结构。举例来讲(不作限制),这类构造包括“工业标准结构”(ISA)总线、“微通道结构”(MCA)总线、“增强的ISA(EISA)”总线、“视频电子标准协会”(VESA)局域总线和也被称作“中层楼(Mezzanine)总线”的“***组件互连”(PCI)总线。
计算机110通常包括各种计算机可读介质。计算机可读介质可以是可由计算机110访问的任何可用介质,它包括易失和非易失介质、可移动和不可移动的介质。举例来讲(不作限制),计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括易失和非易失的可移动和不可移动介质,该介质以用于信息(例如,计算机可读指令、数据结构、程序模块或其他数据)存储的任何方法或技术来加以执行。计算机存储介质包括(但不局限于)RAM、ROM、EEPROM、快闪存储器或其他存储技术、CD-ROM、数字通用光盘(DVD)或其他光盘存储器、盒式磁带、磁带、磁盘存储器或其他磁性存储设备、或可以被用来存储所需信息并可以由计算机110来存取的任何其他的介质。通信介质通常具体表现计算机可读指令、数据结构、程序模块或调制数据信号(例如,载波或其他传送机制)中的其他数据,它包括任何信息传递介质。术语“调制数据信号”意味着一种信号,该信号的一个或多个特征按这样一种方式来加以设置或更改,以便为该信号中的信息编码。举例来讲(不作限制),通信介质包括有线介质(例如,有线网络或直线连接)和无线介质(例如,声音、RF、红外线和其他无线介质)。以上任何内容的组合也应该被包括在计算机可读介质的范围以内。
***存储器130包括采取易失和/或非易失存储器(例如,只读存储器(ROM)131和随机存取存储器(RAM)132)形式的计算机存储介质。基本输入/输出***133(BIOS)有时被存储在ROM 131中,该基本输入/输出***包含有助于在计算机110内的各个元件之间传送信息(例如,在启动期间)的这些基本例行程序。RAM 132通常包含可立即由处理单元120进行存取并且/或者目前正由处理单元120进行操作的数据和/或程序模块。举例来讲(不作限制),图1展示了操作***134、应用程序135、其他程序模块136和程序数据137。
计算机110也可以包括其他可移动/不可移动的易失/非易失计算机存储介质。仅仅举例来讲,图1展示了从不可移动的非易失磁性介质读取或对其写入的硬盘驱动器140、从可移动的非易失磁盘152读取或对其写入的磁盘驱动器151,以及从可移动的非易失光盘156(例如,CD ROM或其他光学介质)读取或对其写入的光盘驱动器155。该示范操作环境中可以使用的其他可移动/不可移动的易失/非易失计算机存储介质包括(但不局限于)卡型盒式磁带机、快闪存储卡、数字通用光盘、数字录像带、固态RAM、固态ROM和类似的存储介质。硬盘驱动器141通常通过不可移动的存储接口(例如,接口140)而被连接到***总线121,磁盘驱动器151和光盘驱动器155通常由可移动的存储接口(例如,接口150)连接到***总线121。
以上所讨论的和图1中所展示的这些驱动器及其关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块和其他数据的存储。在图1中,例如,硬盘驱动器141被展示为存储操作***144、应用程序145、其他程序模块146和程序数据147。注意,这些部分可以等同于或不同于操作***134、应用程序135、其他程序模块136和程序数据137。操作***144、应用程序145、其他程序模块146和程序数据147在这里被提供不同的号码,以展示:它们至少是不同的副本。用户可以通过输入设备(例如,键盘162)和指点设备161(通常被称作“鼠标”、“跟踪球”或“触摸垫”)来将命令和信息输入计算机100。其他输入设备(未示出)可以包括话筒、操纵杆、游戏垫、圆盘式***天线、扫描仪或类似的输入设备。这些和其他的输入设备经常通过被耦合到该***总线的用户输入接口160而被连接到处理单元120,但也可以由其他接口和总线结构(例如,并行端口、游戏端口或通用串行总线(USB))来加以连接。监视器191或其他类型的显示设备也可以经由接口(例如,视频接口190)而被连接到***总线121。除该监视器以外,计算机还可以包括其他***输出设备(例如,扬声器197和打印机196),这些***输出设备可以通过输出***接口195来加以连接。
计算机110潜在地在使用与一台或多台远程计算机(例如,远程计算机180)的逻辑连接的联网环境中进行操作。远程计算机180可能是个人计算机、服务器、路由器、网络PC、对等设备或其他公共网络节点,它通常包括以上相对于计算机110而描述的许多或全部的这些单元,尽管图1中只展示了记忆存储设备181。图1中所描绘的这些逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可以包括其他网络。这类联网环境在办公室、企业范围的计算机网络、内联网和因特网中很普遍。
当被用于LAN联网环境中时,计算机110通过网络接口或适配器170而被连接到LAN 171。当被用于WAN联网环境中时,计算机110通常包括调制解调器172或用于在WAN 173(例如,因特网)上建立通信的其他装置。调制解调器172(可能是内置的,也可能是外置的)可以经由用户输入接口160或其他合适的机制而被连接到***总线121。在联网环境中,相对于计算机110而描绘的程序模块或其各个部分可以被存储在该远程存储器存储设备中。举例来讲(不作限制),图1将远程应用程序185展示为驻留在存储器存储设备181上。将会理解:所示的这些网络连接起示范的作用,可以使用在这些计算机之间建立通信链路的其他装置。
图2是高层示意图,它识别具体表现本发明的一种图形显示结构的各个组件,并且并入动画制作***的一套交互作用的功能组件。图2中所描绘的该图形显示结构被分成一套功能组件,以帮助描述本发明的示范实施例。本发明不局限于采用说明性描绘的该方式的这些组件的布置。相反,这里所描述的这些组件的功能性在本发明的选择性实施例中被加以不同地分组。
该动画制作***包括许多子组件,这些子组件根据应用程序200所提出的高层指令以组方式促进了图形显示对象(以及非视觉参数)的动画化。应用程序200可以是驻留在该操作***以内或以外的任何应用程序或控制器。这里所描述的该动画基础结构在很大程度上允许委托概括通用化的动画制作组件来为动画制作编程并执行动画制作。在本发明的实施例中,应用程序200将命令提交给为一个或多个显示对象规定/定义动画的该动画制作***,而不是计算被更新的位图。
根据应用程序200的命令,该动画制作***构建动画对象。一旦动画对象被实例化,它们就可以与元素树202相关联。响应于应用程序200所生成的事件,来创建元素树202。这类事件的例子包括应用程序200的开始或导致新视图的创建的其他某个被执行的命令。其后,在元素树202中,该应用程序创建新的元素,以后移去这些元素。
元素树202包括分层布置的一组元素。在本发明的实施例中,元素树202在结构上定义了一个文档。每个元素描述一个对象,在大多数情况中,该对象对应于可以显示在(例如)图形用户界面上的视觉图像。元素的例子包括:按钮、表格、表格单元、列表控制、帧、图像和段落(流动面板)。元素树202中的元素一般包括一个或多个属性(例如,颜色、高度、宽度、位置、透明度等)。被分配给元素的这些属性的值有助于定义该元素的显示状态。在本发明的实施例中,动画对象被分配给一个或多个元素/属性组合。其后,该动画对象实例用于根据与这些动画对象实例中的每个动画对象实例相关联的时间线索来呈现元素的属性上的动画行为。
“时间线索”
定时和时间线索驱动这里所描述的该动画制作***。这里所描述的该动画制作***的定时方面父于该“同步多媒体集成语言”(SMIL 2.0)W3C规范。一旦被创建并在执行以前,每个动画对象与时间线索(例如,时序定义)相关联,该时间线索控制与该动画对象的定义行为关联的一连串变化的进程。另外,以上所述的时间线索只定义动画行为(例如,该动画的持续时间、重复、加速等)的局部/相对的时标序列。这样,直到已为该动画对象分配“父”(present)时间线索(要么直接通过另一个对象,要么间接通过另一个对象),动画对象才能够执行。所以,为了执行该动画对象,该相对的时间线索附属于“父”定时定义(“父时间线索”),该“父”定时定义将该动画对象的相对定时定义与父时间线索所定义的实际执行时间联系起来。这样,该父时间线索不会控制动画对象的该动画行为。而是该父时间线索控制该外部行为(例如,当该动画制作实际上开始时)。这些时间线索被保存在分层定时树形结构中,并且,单独的时间线索具有相对于父时间线索来定义其行为的性质。相对于根部(例如,文档、页、帧等)时间线索来定义项层时间线索。
有许多方法可以使父时间线索与动画对象相关联,该动画对象具有定义其局部动画定时行为的其自己的内部时间线索。举例来讲,父时间线索是该动画对象所附属的定时定义。在指定时间线索的一种示范模式中,请求创建动画对象的实体(例如,应用程序)规定关于该动画对象的时间线索所附属的父时间线索。在这种情况下,该动画对象的时间线索在创建时刻识别该父时间线索,并且,这个被创建的动画对象是一个或多个元素/属性组合(该动画对象其后与之关联)所使用的那个实际执行的动画对象(与副本相对)。
在指定关于动画对象的时间线索的另一种示范模式中,创建部分完全的动画对象类,该类包括其自己的时间线索,但不包括父时间线索。这种不完全形式的动画对象定义(缺乏父时间线索)在这里被称作“动画模板”。不执行这些动画模板,而是创建动画模板的副本(或克隆),并且,为这些新的动画实例中的每个动画实例分配这个新的动画所附属的元素的动画父时间线索。在这类实例中,被克隆的动画对象的该父时间线索是由这个被克隆的动画对象所附属的元素规定的那个父时间线索。若缺乏特殊的父时间线索定时定义,则允许从单一动画模板中创建多个克隆,并且,每个“被克隆”的动画对象采用由它所附属的该元素定义的元素指定动画执行(例如,开始、暂停等)定时。由于本***支持以后指定父时间线索,因此,为放置到元素树202上而被创建的动画对象不要求在创建时刻明确地指定父时间线索,尽管要完成这类定时信息,以允许执行该动画制作。
作为选择,应用程序200经由媒体集成层(MIL)界面206,将动画对象直接传递到媒体集成层(MIL)204。举例来讲,Beda等人的、2002年6月27日提交的标题为《多层图形处理***和方法》的美国专利申请(序号为10/184795)中描述了MIL 204,该专利申请的这些内容通过引用被特别包括于此,包括其中所包含的任何引用的内容。在本发明的实施例中,从应用程序200那里直接被传入MIL界面206的动画对象要求明确地指定父时间线索,或者,不执行该动画对象。
MIL 204包括经由MIL界面206来存取的一套图形显示对象呈现和控制组件。举例来讲,Beda等人的、2002年6月27日提交的标题为《关于场景图的类属参数化》的美国专利申请(序号为10/184796)中描述了MIL界面206,该专利申请的这些内容通过引用被特别包括于此,包括其中所包含的任何引用的内容。MIL界面206是应用程序200或提出***(presenter system)208(以下所描述的)借以依靠来建立应用程序的显示帧的低层说明的界面。MIL界面206包括一组方法调用:DrawLine(...)、PushTransform(...)和PopTransform(...)。由MIL界面206提供服务的这些调用描述场景/文档/或图形用户界面。
这里所提到的本发明提供了一种基础结构,用于定义关于图形对象的动画以及随时间的推移而改变的任何参数值。这样,可以由各种图形呈现引擎(例如,包括这里所概述的MIL 204)中的任何图形呈现引擎来执行这个实际的动画。
元素树202所维护的这些元素代表高层图形项目(例如,按钮、滚动条等)。在本发明的实施例中,不可以直接由MIL 204组件使用在高层描述的这类图形对象。这样,提出***208内的提出器(presenter)将元素树202(该提出器与其关联)的组成部分编译/转变为构成元素树202的这些元素的视觉图象(例如,线、填满的矩形等)。提出***208经由MIL界面206,将这些视觉图象传入MIL 204。有许多方法可执行提出***208的功能性。Parikh等人的、2003年5月9日提交(快递邮件EV 329734584美国)的标题为《用于主控图形布局/展示对象的***》的美国专利申请(序号为10/(还未被分配的序号))中详细描述了提出***208的示范实施例,该专利申请的这些内容通过引用被特别包括于此,包括其中所包含的任何引用资料的内容。
在本发明的特定实施例中,MIL 204包括视觉高层视觉树210,视觉高层视觉树210能够处理由提出***208经由MIL界面206传入MIL 204的这些视觉图象。视觉高层视觉树210包含一组结构化的图元(例如,线、矩形、图像等)。这组结构化的图元描述关于应用程序的单个图像帧。视觉高层视觉树210支持被称作“独立动画”的一种类的动画。以下将进一步加以描述的这些独立动画不依靠提出***208布局功能来实现动画制作。
视觉低层视觉树212潜在地是视觉高层视觉树210的平直版本。视觉低层视觉树212被配置成迅速呈现并执行经由视觉高层视觉树210而被传递到视觉低层视觉树212的独立动画。视觉低层视觉树212潜在地在对其结构形式(例如,视觉高层视觉树210)的各项更新之间执行多个帧。
视觉低层视觉树212被配置成与输出驱动器接口。远程机器网络通信驱动器214是与应用程序200在那里呈现输出的机器相对应的对象。该机器潜在地不同于应用程序200在其上执行的机器。在这种情况下,应用程序200在网络连接上传达其视觉输出,以便为应用程序200的用户在远程机器上显示输出。
作为选择,视觉低层视觉树212向图形显示驱动器216呈现输出。图形显示驱动器216表现该帧显示数据与本地机器上的硬件的通信,该本地机器负责为本地用户将该帧引到当前正在运行应用程序200的机器的输出显示设备(例如,视觉显示屏幕)。
当正在进行动画时,呈现队列项目213确保动画之间互相同步。每次需要呈现新的帧时——例如,当更改元素树202时或当动画对象使值变化时,创建呈现队列项目213。呈现队列项目213一得到完全的处理,就会消逝。在执行其同步任务的过程中,呈现队列项目213组织以下过程:为(以上所描述的)定时树228做标记,因而使依赖的动画属性无效;调用提出***208,以便将布局最后定下来,并且在该标记程序完成之后更新视觉高层视觉树210;以及,在提出***208将该布局最后定下来之后,请求视觉树210编译这些变化并将其向下传播到视觉低层视觉树212。以下参照图3来描述执行呈现队列项目213的各种功能的过程中的各个步骤。
已描述了根据所提供的动画值来维护并生成一个帧的数据的某些示范功能框,现在来注意元素树202内的动画属性的这些来源及其时间驱动的变化。属性***220负责维护关于属性的值。属性***220存储并计算元素上的值,以便提出***208可以使用它们来创建视觉高层视觉树210。属性***220支持关于属性值的遗传模型——其中,关于特定属性的元素的值由该元素的子元素(children)集来继承。
如图2中作为例证所描绘的,属性***220从许多来源接收输入值。应用程序200设置由属性***220维护的、关于动态属性的基本值(并且也检索其当前值)。元素树202向属性***220请求值(关于元素树202内的元素属性),以提供给提出***208。提出***208依次又使用这些属性值来生成输入,用于对MIL界面206的调用。在处理元素树202的这些元素的过程期间,提出***208向属性***220请求动态属性基本值以及与这些元素关联的其他信息,以便组织值,并将其分配给构成与提出***208关联的特定视图的这些元素。
属性***220为来自这些不同来源的值区分优先次序。例如,属性***220允许在本地规定的属性值优先于属性页中所规定的值或从父继承的值。属性***220包括逻辑,以便为各种来源所提供的值分类,并将最高优先值返回给该值的任何接收者。属性***220在计算关于属性的当前值时,考虑附属于该属性的任何活动动画。如果用户向特定来源请求值,那么,属性***220处理这类请求。
从动画类222中实例化对由属性***220所维护的属性值作出更改的动画对象,动画类222定义并执行根据与这些动画对象实例(或其父)关联的时间线索来修改属性值的方法。动画类对象实例由应用程序200来创建。应用程序200也在从动画类222中被实例化的这些动画对象上设置值。应用程序200也能够请求特定动画类对象上的当前值。当不存在关于动画类对象的引用时,移去该动画类对象。动画类222每个都具有描述特定动画行为的、能指定的属性(例如,“From”、“To”和“Duration”)。
键入动画类,以便存在关于不同的动画行为及其对应的数据类型的不同类。动画类的例子包括:
FloatAnimation——提供浮点值,
BoxUnitAnimation——提供关于提出框的维数,
PointAnimation——提供矩形的左上部的位置,
ColorAnimation——提供时变彩色值;以及,
BoolAnimation——提供布尔值。
动画类220的实例是不可改变的。这样,一旦创建它们,它们的属性值就永远无法改变。这意味着:应用程序书写者可以在多个地方再使用动画实例,而无须关心其定义的行为将会改变。
动画收集类224组织动画类222。动画收集类由应用程序200来创建。应用程序200规定动画收集类内所包含的一个或多个动画类222。然后,应用程序200将动画收集类设置为将为属性***220中的动态属性制作动画的该动画收集。应用程序200也可以使动画收集类实例与任何动态属性相关联,该任何动态属性与元素树202中的任何特定元素关联。应用程序200能够列举动画收集类224的特定动画收集类中的这些包含的动画类,并且能够向该动画收集类请求组成的动画值。动画收集类实例是当不存在关于这个特定动画收集类实例的引用时所收集的无用信息。
动画收集是处理同一种数据类型的动画对象收集。动画收集类知道其列表中的这些动画类的相对属性以及如何根据被传入该动画收集类实例的基本值来共同组成这些动画类,并且,该动画类返回当前值。在本发明的实施例中,动画类在动画收集类中被栓连在一起。该动画收集的输入接收基本属性值。第一个阶段(动画对象)将相同类型的修改过的属性值呈现为到下一个潜在阶段的输入(在动画收集类对象内的多个动画对象的情况中)。该动画收集的这些流水线动画对象所执行的该基本值的流水线处理呈现关于该动画属性的当前值。这种流水线处理的结果是:创建被串联执行的合成动画功能。
存在用于每种类型的属性值(为其支持动画制作)的动画收集类(例如,FloatAnimationCollection、BoxUnitAnimationCollection、PointAnimationCollection、ColorAnimationCollection和BoolAnimationCollection)。这个动画收集类类型列表只是起示范的作用。精通该技术领域的人将会容易理解不同动画收集类类型的潜在的宽度。至于动画类220,来自动画收集类224的动画收集类的实例是不可改变的。
动态动画收集类226建立于动画收集类224的功能性上。动态动画收集类226的一个实例保持对动画收集类224的动画收集类一个实例的引用。此外,动态动画收集对象的一个实例保持对元素树202内的元素以及对该动态动画收集实例正在为其制作动画的该元素上的属性的一个引用。在本发明的实施例中,应用程序书写者无法创建或存取动态动画收集实例。而是一当从应用程序220那里接收到请求,属性***220就创建动态动画收集实例。
当动画收集类实例与动态属性关联时,动态动画收集对象实例由属性***220来创建。该动态属性保持并/或计算与关于元素树202中的元素的单一定义属性(例如,宽度、高度、顶部、左边或任何种类的元素的任何其他的定义属性)有关联的值。该动态动画收集也保存从动画收集类224的动画类中被实例化的动画收集,并且因而使该动画收集类与元素树202中的特定元素/属性组合相关联。如果向属性***220要求动态属性的当前值,则属性***220确定该动态属性是否具有从动态动画收集类226中被实例化的关联的动态动画收集对象,并且,属性***220通过该动态动画收集中的任何当前活动的动画类来处理该基本值,以提供当前动画值。在本发明的实施例中,当属性***220请求关于当前值的特定动态动画收集对象时,这个规定的动态动画收集将该请求传给从动画收集类224之一中被实例化的合适的动画收集对象。该动画收集对象又循环通过从动画类222中被实例化的其动画对象集,以呈现它们的当前值,从而提供关于该动画收集对象向其调用动态动画收集呈现最终值的基础。
应用程序200所创建的一些动画可能不规定父时间线索,并且期望该动画制作***为所请求的动画选择这个合适的父时间线索。在该关联过程期间,属性***220最初确定该动画收集类内的每个动画类是否具有父时间线索。如果任何动画类都不与父时间线索关联,那么,创建与显示元素(与该动态动画收集关联)的父时间线索关联的新的动画类。另外,注意,如果改变与显示元素关联的该父时间线索,那么,再建该动态动画收集,以反映该父时间线索中的这个变化。
为了正确地发挥作用,动画收集类内的所有动画类最后都必须规定控制其执行定时的父时间线索。如果这个规定的动画收集类中的所有这些动画类都与父时间线索关联,那么,该动态动画收集使用这个规定的动画收集类。否则,鉴于动画类和动画收集类的不变性,属性***220创建新的动画收集类,并且,这个新的动画收集类包括新的动画类——每个具有被分配的父时间线索。一旦属性***220已创建这个新的动画收集类(其每个动画对象具有父时间线索),属性***220就为与该元素/动态属性对关联的该动态动画收集提供该动画收集类。如果还没有与这个对关联的动态动画收集,则该属性***将创建新的动态动画收集226。
如以上多次指出,定时驱动与动画对象关联的这些动画行为,这些动画对象附属于元素树202中的元素的属性。如这里所使用的,时间线索是根据一组定时性质来维护运行时间状态的定时实体的实例。在本发明的实施例中,定时树228是包含按分层方式来布置的定时节点(时间线索)的数据结构。定时节点之间的关系由遗传规则并由与定时树228中的定时节点相对应的每个时间线索的这些节点特定定时性质来加以定义。这些遗传规则包括:定义与父开始时间有关的子段开始时间(children begin times)的偏移量。另外,这些遗传关系规定控制关系。例如,如果重新开始、重复、暂停、恢复、查找或结束父,则所有这些子段(及其子段等)都这样做。这类关系允许通过在单一父时间线索上的动作来起动一整组子时间线索。定时树228保持:(1)潜在地驱动对动画类实例的值的变化的时间线索,以及(2)包含其他时间线索的容器时间线索。使用从这些时间线索中导出的进展值来计算任何给定的动画对象的当前值。在应用程序200的启动时刻创建定时树228。
定时树228为图2中所描绘的该动画基础结构实行定时事件通知任务。最初,当实例化动态动画收集时,该动态动画收集向定时树228发出请求,以便只要其动画收集类对象中的动画实例已有进展,就发出通知。当该动态动画收集从定时树228那里接收到通知“其动画之一已有进展”时,该动态动画收集实例通知属性***220:该显示元素(与它关联)上的该动态属性现在无效。显示元素属性的无效依次又开始在这里被称作“从属动画”的过程。在从属动画处理期间,要求提出***208根据与该动画制作关联的该值变化来建立视觉高层视觉树210。
定时树228也为动画类222的实例执行进展测量和报告任务。响应于无效,要求动画类222的实例报告其当前值。动画类222向定时树228询问与每个动画类关联的时间线索进展值。其后,动画类222根据该定时树所提供的进展值来计算其当前值,并将这些当前值提供给任何请求实体。
呈现队列项目213也与定时树228相互作用。该呈现队列项目是该操作***队列中的队列项目,当被执行时,该操作***队列使应用程序200所生成的该应用程序/页/场景被向下编译到视觉低层视觉树212,并且最后被呈现到该显示设备上。一旦被调用,该呈现队列项目所执行的第一件事是为定时树228“做标记”。这具有“让该定时树将其时间线索更新为该当前时间”的效果。结果,定时树228发出可能会引起属性***220中的许多无效的通知。当执行该标记时,也更新独立动画的进展值。如果在呈现队列项目213的处理期间修改定时树228,该呈现队列项目将同时循环和“再标记”,直到定时树228稳定为止。
独立/从属动画
以上提到了独立动画和从属动画。在本发明的实施例中,图2中所描绘的该动画制作***至少支持这两种类型的动画实例——其分类基于它们与其他动画实例的关系。独立动画实例不影响视图的布局,因此可以按更高的速率来加以刷新。独立动画的例子是彩色动画。对象的颜色不修改其宽度或高度,所以,该颜色变化动画不影响如何在该页上布置该颜色变化动画元素(例如,尺寸或位置)。
从属动画一般更改与这些从属动画关联的元素的布局,所以,从属动画要求再计算图形用户界面布局。这些从属动画实例被存储在元素树202结构内,以确保所有受到影响的显示元素属性的正确处理。由于潜在的相当多的计算和存储器存取要求,MIL 204按潜在较低的刷新率来计算从属动画。
关于“动画”类的三个层次/阶段
在本发明的实施例中,通过三个层次的类及其对应的实例来执行被应用于显示元素属性的该动画行为。继续参照图2,动画类222包括定义对象的一组对象类,它们能够计算属性值上的特定的、被定义的动画操作(通常是单一动画行为)。
在下一个层次处,动画收集类224定义一组对象,这组对象将来自动画类222的一个或多个单独的动画类分组/分配到单一动画类定义中,从而支持单一元素属性上的合成动画行为的创建。
在下一个层次处,动态动画收集226定义对象类型,以实行/执行元素树202内的元素的属性上的动画行为(由动画收集类224之一来定义)。这种功能性得到动态动画收集226的实例的促进,动态动画收集226保持:对动画收集类224的动画收集类实例的一个引用;以及,对元素树202内的元素的引用,以及对该动态动画收集实例正在为其制作动画的该元素上的属性的引用。当动画收集类实例与动态属性关联时,动态动画收集由属性***220来创建。该动态属性保存并/或计算与关于元素树202中的元素的单一定义属性(例如,宽度、高度、顶部、左边或任何种类的元素的任何其他的定义属性)关联的值。该动态动画收集也保持对从动画收集类224之一中被例示的动画收集类对象的引用,并因此使该动画收集类对象与元素树202中的特定元素/属性组合相关联。
参考图3,为图2中的呈现队列项目213所执行的示范呈现序列概述一套步骤。如以上所解释的,当被执行时,呈现队列项目213使应用程序200所生成的该应用程序/页/场景被向下编译到视觉低层视觉树212,供显示设备来呈现。注意,这一连串步骤起示范的作用,并且,该呈现队列项目操作在本发明的其他实施例中被加以修改。
最初,在步骤300期间,呈现队列项目213引起定时树228的标记。为定时树228做标记具有这个效果:让定时树228将其时间线索更新为该当前时间。结果,定时树228发出可能会在属性***220中引起许多无效(例如,使从属动画属性无效)的通知。在本发明的实施例中,已受到该更新时间影响的动画对象提出Changed事件。这些事件由动画对象的关联的“动态动画收集”对象实例来收集和处理。该“动态动画收集”对象又使元素上的其动态属性无效。当在步骤300中执行该标记时,也更新独立动画的进展值。
在为定时树228做标记之后,在步骤310期间,由呈现队列项目213来执行布局过程。在布局过程310期间,自从最后一次执行呈现队列项目以后,根据对元素树202的任何更改来更新视觉高层视觉树210。在本发明的实施例中,负责在视图中布置已改变属性值(作为该时间的标记的结果)的图形元素的提出器成为无效——这意味着:它们必须再计算其布局,并创建将这些变化并入这些受到影响的动态属性的新的视觉高层视觉树。也在步骤310期间,该显示***从潜在地影响该布局的应用程序、该操作***外壳程序等接收和分派请求。这类请求的例子包括命中测试、对用户程序的回收,以及影响该图形显示的一般应用动作。
在布局过程310期间,定时树228结构可以潜在地改变(例如,增加新的定时节点、移去现存的节点、建立对现存的定时节点的新参考等)。如果在步骤320中确定该定时树结构已改变,那么,控制传回到步骤300,并且在采取其新形式的定时树228上再执行该定时标记。
如果定时树228在结构上还没有改变,那么,控制从步骤320传递到“呈现”步骤330——其中,视觉高层视觉树210将新的/更新的图形显示数据编译和传播到视觉低层视觉树212。根据这些所接收的变化,视觉低层视觉树212向驱动器262和/或264呈现被再计算的输出。
其后,在步骤340期间,询问与该动态动画收集关联的这些时间线索,以便下一次确定:需要为它做标记(最接近的事件)。如果不需要进一步的标记,那么,控制传递到“结束”360。如果需要该树的额外标记,那么,控制传递到步骤350——其中,为这个动画元素属性的动态动画收集实例创建呈现队列项目213的新实例。这个新的呈现队列项目规定其应该被执行的时间。如果这个规定的执行时间是还没有被达到的某个时间,那么,该呈现队列项目最初被放置在不活动列表中。当达到该时间时,该呈现队列项目被放置在活动队列内,用于根据图3中所陈述的这些步骤来执行。在创建这个新的呈现队列项目之后,控制传递到“结束”360。
关于元素属性的动画行为由从动画类222中被例示的一个或多个动画对象来实行。每个动画对象包括动画功能,该动画功能采取第一组输入(至少包括当前时间线索值),并产生适合用于呈现动画显示元素的一种类型的输出。动画类222中的各种动画类(例如,PointAnimation)将时间线索进展值转换成关于元素属性的合适的数据类型(例如,点)。
参考图4,概述示范的高级动画类结构。这各种动画类遵循共同的式样,并执行一组类似的界面。这些差异主要出现在这些属性的数据类型中,并出现在一些计算中,这些计算被加以执行(鉴于诸如浮点、布尔值、点等该特定数据类型),以便鉴于所计算的进展值来将当前值分配给输入值。鉴于这里所包含的动画类的功能性的这些例子和说明,这类修改正好在精通该技术领域的人的技能范围以内。
在本发明的实施例中,该动画类结构包括一组“动画属性”400。From属性指定开始动画值。To属性规定结束动画值。By属性规定动画制作结束时的变化(δ)值。该By属性规定结束动画值与初始动画值之间的差异,而不是在该To属性中规定明确的最终值。
动画类可以包括利用每个段内的不同的定时参数的多个段。KeyValues属性规定关于动画的值的列表。***法属性规定用于在该KeyValues属性中所规定的两个关键字值之间进行***的方法。***法的例子包括:离散、线性、步距和样条。KeyTimes属性指定被用来控制该动画的步距的时间值列表。该列表包含与该KeyValues列表相同的元素数量。以增加的时间值对列表排序,并且,该列表中的第一个值是0,最后一个值是1(除非InterpolationMethod被设置为“离散”,在这种情况下,这最后的值可能小于或等于1)。KeySplines属性规定与KeyTimes列表关联的一组贝齐尔曲线控制点。这些贝齐尔曲线控制点定义控制该动画的间隔步距的立方函数。该列表包含比该KeyTimes列表少一个的元素。如果该InterpolationMethod性质被设置为“样条”,则只使用该列表。
动画类结构内的这些动画属性包括某些布尔性质。如果该动画对象的时间线索是活动的或在填充时期内,则将IsOverridingBaseValue属性设置为“真”。另外,IsAccumulating属性允许重复的动画序列对元素的属性产生累积的影响。当将该IsAccumulating属性设置为“真”时,而不是在重复的动画序列的每个迭代上重复相同的轨迹,动画累积每个迭代的效果,本质上是利用自身来组成并建立于对元素的属性的先前的动画诱发的变化。
如果对于(以下联合一套方法420所描述的)该动画对象的GetValue的返回值取决于该基本值(被提供给该动画对象),则UsesBaseValue属性返回“真”。如果该UsesBaseValue属性返回“假”,那么,该动画对象完全忽略该基本值。如果该动画对象在列表中,则该UsesBaseValue属性允许优化,其中在一些情况下,只需要评估这些动画对象的子集。
该动画类结构也包括一组定时属性410。CurrentTime属性提供关于该动画对象的、该时间线索本地的当前时间。ParentTimeline属性指定时间线索,该时间线索是该动画对象的时间线索的定时父。该ParentTimeLine属性可以参考任何其他的时间线索,或者可以参考两个特殊引用值之一:Timeline.VisualParent或Timeline.RootTimeline。如果该ParentTimeline属性被设置为Timeline.VisualParent,那么,该时间线索在使用方面自动成为与它被用于其中的该视觉图象关联的那个时间线索的父。如果该视觉图象没有关联的DefaultTimeline,那么,用递归方式检查该父视觉图象。如果该ParentTimeline属性被设置为Timeline.RootTimeline,那么,这个时间线索在使用方面自动成为定时树228的该“根”的父。
这个定时属性集也包括Begin属性,该属性用于指定关于该特定动画对象的时间线索应该开始的时间。默认的情况是:该开始时间值是相对于父时间线索的开始时间,但也潜在地规定偏移量,从而提供相对于其他某个时间线索的开始时间或结束时间的时间。在后一种情况下,这另一个时间线索必须成为与关于这个特定动画对象的时间线索相同的时间线索的父。动画对象上的Duration属性指定从始到终单个周期的持续时间。Progress属性指定该时间线索的当前进展值。如果(以下所描述的)IsOverridingBaseValue是假的,那么,该Progress属性返回0。在所有情况中,该Progress属性的这个返回值始终是包括0与1之间的值。
在本发明的实施例中,支持对动画的重复。RepeatCount属性规定在这个动画对象的使用期限期间应该重复从始至终的周期的次数。该RepeatCount属性值潜在地是分数值。特殊值float.PositiveInfinity指出:该时间线索应该连续重复。如果它重复的话,则CurrentRepeat属性规定该时间线索的当前迭代。第一个迭代是迭代1。如果该IsOverridingBaseValue动画属性是假的,则该CurrentRepeat属性返回0。
RepeatDuration属性规定应该在其内重复从始至终的周期的时间长度。这会潜在地导致分数执行(重复计数)。Time.Indefinite的该RepeatDuration属性值指出:该时间线索应该永远重复。如果该IsOverridingBaseValue属性是假的,则这个属性返回Time.Unspecified。如果为该RepeatCount属性和该RepeatDuration属性规定值,那么,该总活动持续时间是这两个被规定的属性的最小值。
关于这些动画类的这些定时属性还包括指定0与1之间的一个值的加速属性,该值表示该时间加速阶段中所花费的该简单持续时间的分数。减速属性指定0与1之间的一个值,表示在该时间减速阶段中所花费的该简单持续时间的分数。由于该动画无法同时加速和减速,因此,该加速属性值和减速属性值的和不超过1(该简单持续时间)。
Autoreverse属性指定:该动画是否将从始至终地进展,然后返回。如果该Autoreverse属性具有“真”的值,那么,该时间线索从始至终地进展,然后立即从终至始地向后进展。该时间线索维持活动的时间将是该动画对象的该Duration属性所规定的时间数量的两倍。
End属性所维持的值为关于该动画对象的时间线索规定最长的结束时间。如果该End属性值小于该Begin属性值和Duration属性值的和,那么,该激活时期缩减该End属性值。此外,忽略越过该End性质所规定的时间的所有规定的动画开端(按计划的或交互式的)。
EndSync属性值定义时间线索的隐含的持续时间。如果没有明确设置该Duration属性,则使用该EndSync属性所规定的该隐含的持续时间。时间线索的该隐含的持续时间可以由它控制的该计时对象来定义,或者由可能成为它的父的其他时间线索来定义。
在该结束时间过去之后,Fill属性规定该动画对象的这个时间线索的行为。默认的情况是:该时间线索只是从始至终维护“运行”,但如果该Fill属性被设置为“冻结”,那么,该时间线索在越过该结束时间后仍然维护运行。在那种情况下,该结束时间之后的该动画对象的该进展值等于它在该结束时间的无论什么值。关于该Fill属性值的设置是“移去”(该全局默认值)、“冻结”和“维护”。FillDefault属性指定关于该Fill属性的默认值。如果没有规定该Fill属性值,那么,该DefaultFill属性的这个值规定该填充行为。此外,这个默认值由成为这个时间线索的父的时间线索来继承,除非它们具有其自己的FillDefault性质集。关于该DefaultFill属性的这些可能的值等同于关于该Fill性质的值。
当达到第二个(或以后的)开始时间时,Restart属性指定该动画对象的时间线索的行为。默认的情况是:开始时间中断任何活动时期,并回到关于该时间线索的时间t=0。但是,如果该Restart属性被设置为WhenNotActive,那么,忽略将会中断活动时期的开始时间。关于该Restart属性的这些可能的值是:Always、WhenNotActive和Never。Restart Default属性为该Resart属性指定默认值。
Speed属性指定关于该动画对象的该时间线索(与其父时间线索相比较)的、时间应该经过的相对速度。例如,1的值意味着正常速度,而2的值则意味着时间以两倍快的速度流逝(所以,该察觉到的持续时间结束只是该Duration性质所规定的持续时间的一半)。这个值可能是负数,在这种情况下,时间在这个时间线索中从结束时间到开始时间向后流逝,好象该父时间线索被颠倒。
一组布尔属性被包括在内,以识别该动画对象的动画的状态。IsForwardProgressing属性识别这个时间线索中的进展是否根据墙钟(wall-clock)时间而从0移到1。该IsForwardProgressing属性考虑被嵌套在潜在颠倒的时间线索中的效果。如果IsOverridingBaseValue是假的,那么,IsForwardProgressing所返回的值等同于这个时间线索的父时间线索将会返回的值。从该时间线索自己的本地引用帧中可见,IsReversed属性识别该时间线索是否在颠倒周期内。与该IsForwardProgressing属性对比,这个属性不考虑被嵌套在潜在颠倒的时间线索中的效果。如果该IsOverridingBaseValue属性值是假的,那么,该Is Reversed属性返回假。
其他属性涉及该动画的活动状态的状态。IsChanging属性识别该动画对象的这个时间线索是否是活动的。相比之下,如果该时间线索是活动的,则IsPaused属性返回真,但该动画被暂停。
该动画类也包括一套方法420。特定动画类内的一套构造器方法创建动画对象,这些动画对象并入特殊动画类类型(例如,浮动、布尔值、点等)的特定动画行为。举例来讲,在以下所描述的图5中,识别与特定动画行为相对应的一套动画构造器方法类型。
BeginIn方法将偏移时间值作为输入来加以接收。该BeginIn方法将来或过去及时地在对应于该偏移值的某个点处触发交互式开始。该输入偏移参数规定关于该动画对象的父时间线索的引用中的时间。如果该父时间线索不是活动的,则这个方法没有效果。
同样,EndIn方法将另一个相对时值作为输入来加以接收。该EndIn方法将来或过去及时地在这个规定的点处触发交互式结束。该参数在该动画对象的父时间线索的该引用帧中。如果该父时间线索不是活动的,则这个方法没有效果。
在该动画对象维持活动的同时,提供各种方法,以停止/开始该动画对象的进展。暂停方法暂停该动画对象的时间线索以及引用该动画对象的时间线索的子段。如果这个时间线索不是活动的,则这个方法没有效果。相反,恢复方法重新开始该动画对象的时间线索及其所有的子时间线索。如果这个时间线索不是活动的并且被暂停,则这个方法没有效果。
查找方法允许根据规定的偏移值而直接移到动画执行序列中的特定点。该查找方法改变潜在地影响其所有子时间线索的、关于这个时间线索的该当前时间。如果该时间线索不是活动的,则这个方法没有效果。
GetUniqueInstance方法将时间线索作为输入来加以接收,并且返回可以与其他实例分开地维护其自己的运行时间状态的动画对象的实例。如果该动画对象包含自动父化的时间线索,则这个被返回的实例具有成为作为参数而被传入的该时间线索的父的那些时间线索。
GetValue方法将某种类型的基本值作为输入,并且返回与该输入基本值相同的类型的另一个值。该输出的这个值既取决于该输入(基本值),又取决于它被传递到那里的该修正器(例如,动画对象/收集)的内部状态。特别是,这意味着:利用相同的输入来调用GetValue一次以上并不被保证可返回相同的输出,实际上,它预期在动画序列的过程期间改变。在动画对象类222的情况中,该GetValue方法接收被传递的基本值,并且根据进展值的其内部修正器定义计算来返回值。
最后,该动画类结构支持一组事件。只要该动画对象的内部状态改变,就会出现Changed事件430。使用Changed事件430标记符来指出:需要再呈现(在位置或维数方面已改变了一些东西)。当对象进入其内部状态正在不断变化的周期时,出现Begun事件信号。只要该对象离开其内部状态正在不断变化的周期,就会出现Ended事件信号。只要该动画对象的时间线索重复其简单的持续时间,就会出现Repeated事件。只要该时间方向在该动画对象的时间线索上变化,就会出现Reversed事件。响应于完成该动画对象的时间线索上的对应的“暂停”、“恢复”和“查找”方法,会出现Paused、Resumed和Seeked这些事件。
参考图5,一组动画对象行为被加以识别。这些被识别的行为中的每个行为对应于特定的构造器类,在适当的时候,该特定的构造器类得到以上先前所列出的这些动画类类型中的每种类型的支持。From构造器类型500创建动画对象,该动画对象将被传递的“From”值作为其初始值,并且进展到该关联的属性上所规定的基本值。To构造器类型510创建动画对象,该动画对象将该关联的属性上所规定的并且被改进为所传递的“To”值的该基本值作为其初始值。From-To构造器类型520接收指定关于该动画对象的该From属性值和To属性值的被传递的参数——在该动画制作期间不使用该动画元素的属性上的该基本值。但是,当该动画序列结束时,除非该动画对象上的Fill定时属性是“冻结”,否则,该元素属性回复到该基本值。
可以通过终点和变化(δ)值的数量来规定动画值范围,而不是为动画规定终点。By构造器530接收δ值,在基本值处开始动画,并且继续在该动画周期过程期间对该基本值进行该δ值所规定的该数量的改变。Form-by构造器540将开始“From”值作为其输入来加以接收,并且继续在该动画周期期间对该初始“From”值进行所传递的δ值的改变。已描述了关于动画对象的构造器的基本集合,注意:本发明计划了众多的各种动画行为(和对应的构造器)——包括这些前述行为的合成物/组合。
已描述了示范的动画类结构,现在来注意这些动画对象的容器——动画收集类224。参考图6,描绘了关于动画收集类的示范结构。动画收集对象维持从动画类224中被实例化的动画对象列表。首先求助于这些动画收集类所支持的一套方法600,GetUniqueInstance方法返回具有与所传递的时间线索标识相对应的默认父时间线索的动画收集实例。该动画收集类也支持用于设置动画收集类上的DefaultParentTimeline属性的界面。在本发明的示范实施例中,属性***220调用该GetUniqueInstance方法来获得关于动态动画收集对象的特定动画收集的副本。该动画收集对象包含动画对象列表。构造器功能/实体将动画对象加入这个所创建的动画收集实例。通过规定该列表内的特定位置(如同在阵列中),来定位并参考/存取该动画收集内的这些动画对象。
GetValue方法将某种类型的基本值作为输入,并且返回与该输入基本值相同的类型的另一个值。该输出的这个值既取决于该输入(基本值),又取决于它被传递到那里的该修正器(例如,动画对象/收集)的内部状态。特别是,这意味着:利用相同的输入来调用GetValue一次以上并不被保证可返回相同的输出,并且,实际上,它预期在动画序列过程期间改变。在该动画收集类的情况中,该GetValue方法将所传递的基本值提供给其收集中的第一个动画对象。这第一个动画对象的输出成为到该动画收集中的下一个动画对象(如果存在的话)的该输入基本值。这个过程进行重复,直到该动画收集中的最后一个动画对象已计算输出为止。该GetValue方法返回该动画收集内的该动画对象流水线内的最后一个动画对象所提供的该输出值。
该动画收集类也包括一组属性610。IsChanging属性和IsOverridingBaseValue属性类似于动画对象上的这些被对应地加以命名的属性。但是,在动画收集类的情况中,这些属性被加以合并,以便如果该动画对象的对应属性中的任何一个属性返回“真”,则该动画收集上的该对应属性返回“真”。该动画(阵列)属性维护该动画收集内的这些动画对象的列表。
该动画收集也支持一组事件620。这些Changed事件结合并报告从该动画收集的这些组成的动画对象中被激发的、以上所描述的这些对应的事件。
现在参考图7,为动态动画收集类226识别一套方法和属性。方法集700包括动态动画收集构造器方法。该动态动画收集构造器方法将元素引用(在元素树202上)、该元素上的动态属性和动画收集实例作为输入来加以接收,该构造器返回动态动画收集对象,该动态动画收集对象作为对这个所传递的动画收集对象内的动画对象进行的这些时间线索诱导变化与元素树202中所包含的该元素上的该动态属性之间的界面而工作。
该动态动画收集对象上的界面支持设置/获得与该动态动画收集对象关联的该动画收集对象。如果该动态动画收集对象所属的该元素被重新定位在元素树202中,或者改变关于该元素的定时,那么,SetDefaultParentTimeline方法修改时间线索连接。
GetValue方法返回关于该元素的动画属性的该当前值(由该动态动画收集所属的该动画收集来提供)。
当该动画收集内的任何动画对象的进展已改变时,调用OnChanged方法。当被调用时,该OnChanged方法引起该动态属性的无效。这又调用了受到影响的元素的再呈现。
参考属性710,OriginalDynamicProperty属性将参考返回给与该动态动画收集关联的该动态属性。Element属性返回与该动态动画收集关联的该元素。该IsOveridingBaseValue将基于调用的值返回给与它关联的该动画收集上的这个被对应地加以命名的属性。
已描述了动画结构,通过为元素上的属性提供时变值,可以使用所描述的该结构来为它们制作动画,这一点通过举例来加以描述。一般而言,每个动画资源、方法或对象包括一个界面,该界面允许通知该实体的动画制作能力、其默认父时间线索、它是否已改变、该对象的当前值,以及该实体是否正在变化。特殊举例来讲,可制作动画的实体的该界面包括DoesChange属性,如果该对象可能随时间而改变,则该属性返回“真”。一般而言,如果该对象正在保持任何动画收集,则该DoesChange属性是真的。DefaultParentTimeline属性将引用返回给时间线索,该时间线索是任何自动父化的时间线索的父。如果设置该DefaultParentTimeline属性,那么,任何自动父化的时间线索重新成为父,但不为这些时间线索或这个可制作动画的对象创建新的克隆。如果可制作动画的对象中的这些动画正在变化,则IsChanging属性返回“真”。如果这个可制作动画的对象的任何时间线索是活动的或在填充时期内,则IsOverridingBaseValue属性返回“真”。只要这个可制作动画的实体的值改变,就会出现Changed事件。
此外,这个可制作动画的实体包括CurrentValue方法,该方法返回被用作该属性的这个值的对象。这个值是该对象的瞬时值,但它一旦被设置,就不会改变。规定特定时间线索的GetUniqueInstance方法返回可以被用作属性的这个值的对象。如果该对象提到任何自动父化的时间线索,则被返回的该实例具有成为这个规定的默认父时间线索的父的那些时间线索。
可制作动画的实体也为每个可制作动画的属性规定对动画收集类型的对应的引用,以促进该属性***创建动态动画收集。在本发明的实施例中,使用动画收集,而不使用基本动画对象,因为这种用法将会排除动画合成。
通过将动画收集加入单独的属性,来为资源制作动画。以下的例子表现了如何利用动画颜色来创建SolidColorBrush。
ColorAnimationBuilder animBuilder=newColorAnimationBuilder();animBuilder.From=new Color(1.0f,0.0f,0.0f,0.0f);animBuilder.Begin=new Time(0);animBuilder.To=new Color(1.0f,1.0f,0.0f,0.0f);animBuilder.Duration=new Time(1000);animBuilder.AutoReverse=true;animBuilder.RepeatDuration=Time.Indefinite;SolidColorBrushBuilder brushBuilder=newSolidColorBrushBuilder();brushBuilder.Color=new Color(1.0f,0.0f,0.0f,0.0f),brushBuilder.ColorAnimations=animBuilder.ToColorAnimation();SolidColorBrush animateBrush=brushBuilder.ToBrush(); |
动画资源可以被用于呈现操作中,也可以被用作关于元素属性的值。举例来讲,通过将动画收集加入绘图上下文方法调用,或者通过使用动画资源,来为呈现操作制作动画。以下的例子表现了如何将动画不透明度值推入绘图上下文。
FloatAnimationBuilder animBuilder=newFloatAnimationBuilder();animBuilder.From=0.0f;animBuilder.Begin=Time.Immediately;animBuilder.To=1.0f;animBuilder.Duration=new Time(1000);animBuilder.Fill=TimeFill.Freeze;myDrawingContext.PushOpacity(0.0f,animBuilder.ToFloatAnimation()); |
通过将动画收集加入Element属性,可以为元素制作动画。以下的例子表现了如何以C charp为按钮的宽度制作动画。
BoxUnitAnimationBuilder animBuilder=newBoxUnitAnimationBuilder();animBuilder.From=new BoxUnit(50);animBuilder.Begin=Time.Immediately;animBuilder.To=new BoxUnit(100);animBuilder.Duration=new Time(1000);animBuilder.Acceleration=0.2;animBuilder.Deceleration=0.2;animBuilder.Fill=TimeFill.Freeze;myButton.Width=new BoxUnit(50);myButton.WidthAnimations=animBuilder.ToBoxUnitAnimation(); |
以下示出XAML中的相同的例子。
<Button ID=″myButton″Width=″50″><Button.Width><BoxUnitAnimationFrom=″50″Begin=″Immediately″To=″100″Duration=″1″Acceleration=″0.2″Deceleration=″0.2″Fill=″Freeze″/></Button.Width></Button> |
只要使用动画(或动画资源),该动画(或资源)就被加以克隆,以便为该目的地提供唯一的、可独立控制的时间线索。对属性执行动画制作的这种特定的方法的结果是:该原始动画从来不是视觉场景的一部分,所以,它不会作出响应,以通过动画对象的定时界面来控制调用。为了实现这个效果,该调用代码必须首先使用动画,然后读回该动画。被读回的该值随后可以被高速缓存,并被用于定时控制。以下的例子示出想要控制动画的那个代码所遵循的样式:
private FloatAnimation myOpacityAnimation;public void Initialize(){FloatAnimationBuilder animBuilder=newFloatAnimationBuilder();//Set the Begin property to Indefinite because wewant to start |
//this animation interactively,not automatically.animBuilder.Begin=Time.Indefinitely;animBuilder.From=1.0f;//Fully opaqueanimBuilder.Duration=new Time(500);//half asecondanimBuilder.To=0.5f;//Half transparentanimBuilder.AutoReverse=true;//Create the animationFloatAnimation animation=animBuilder.ToFloatAnimation();//Animate the opacity of some element we ownmyElement.Opacity=1.0f;myElement.OpacityAnimations=animation;//ERROR:The following line doesn′t have theintended result://myOpacityAnimation=animation;////This line caches an animation″template″,notthe actual animation//that controls the opacity of the element.//This caches the right animation--the one thatis actually in use:myOpacityAnimation=(FloatAnimation)myElement.OpacityAnimations[0];}public void OnSomeEvent(){//Whenever we detect some event,″blink″theelementmyOpacityAnimation.BeginIn(0);} |
精通该技术领域的人将会理解:已描述了新的示范平台以及被并入其中的示范的界面、类和结构,用于:在包括图形输出设备(例如,图形用户界面显示器)的计算环境内,附上并执行对图形显示元素的动画行为。鉴于可以应用本发明的这些原理的这许多可能的环境以及设计和执行上述动画结构的灵活性,应该认识到:这里所描述的这些实施例意在起说明的作用,而不应该被视作限制本发明的范围。精通应用本发明的技术领域的人将会理解:在不脱离本发明的精神的前提下,可以在布置和细节方面修改这些说明性实施例。所以,如这里所描述的本发明计划可以将所有这类实施例纳入以下的权利要求书及其相等物的范围以内。