颜色和透明度 3.doc_第1页
颜色和透明度 3.doc_第2页
颜色和透明度 3.doc_第3页
颜色和透明度 3.doc_第4页
颜色和透明度 3.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.3 颜色和透明度动画中不仅包含着对象位置和大小的变化,还会包含对象颜色和透明度的变化。两者有机结合,方才构成了绚丽多彩的动画效果。本节将介绍如何控制动画对象的颜色和透明度。8.3.1 操作透明度在Flash中,直接修改显示对象的透明度较为简 单。所有的DisplayObject及其子类都有alpha属性,只需要指定相应的值,就能完成对透明度的更改。值得注意的是,AS3中规定Alpha 的值是从0到1的小数,或者说是0到100%的百分数。但是对于使用设备字体的textField对象,alpha属性不能正常起作用。8.3.2 ColorTransform类改变显示对象的颜色,相对要困难一些,AS3提供了 强大的颜色变换类ColorTransform。同上一节谈到的控制形状位置的Matrix类相似,ColorTransform类在 displayObject.transform属性中也有一个对象实例。不过其名字为 displayObject.transform.colorTranform。注意对象名称大小写的变化,AS3大小写敏感。使用displayObject.transform.colorTranform的步骤同displayObject.transform.matrix对象相似:(1)首先创建一个ColorTransform对象myColorTransform。(2)然后将目标显示对象的transform.colorTransform对象复制到myColorTransform之中。(3)使用myColorTransform类的各种属性或方法进行操作。(4)用myColorTransform替换显示对象内部的transform.colorTranform,FlashPlayer会自动使用colorTranform的数据对显示对象进行相应变换。ColorTransform类的构造函数如下:ColorTransform(redmulti,greenmulti,bluemulti,alphamulti,redoffset,greenoffset,blueoffset,alphaoffset);构造函数 “ColorTransform()”中的所有参数都是Number类型,但实际上redmulti、greenmulti、bluemulti和 alphamulti是0到1的小数。Redoffset、greenoffset、blueoffset、alphaoffset是从-255到255 的整数。注意这里alphaoffset的取值范围是0到255,而AS3中DisplayObject.alpha属性的取值是0到1,两者不要混淆。当将ColorTransform对象附加至显示对象时,RGB和Alpha四个通道都会分别进行计算和变换。最终颜色的计算方法为:红色通道最终值=红色通道原有值*redmulti+redoffset。绿色通道最终值=绿色通道原有值*greenmulti+greeboffset。蓝色通道最终值=蓝色通道原有值*bluemulti+blueoffset。透明通道最终值=透明通道原有值*alphamulti+alphaoffset。经过运算后,通道最终值只能在0到255之间。超过255的数值,自动转换为255,负数自动转化为0。8.3.3 实例应用下面通过实例8-3学习ColorTransform对象。(1)新建项目。如图8-9在舞台上建立名为color_rect1,color_rect2,color_rect3的三个矩形MovieClip对象,填充颜色为R255,G48,B0,alpha100。如图8-9所示水平排列:(2)选中时间轴,在代码编辑器中输入以下代码:/操作color_rect1color_rect1.alpha=.5;/操作color_rect2var color_trans:ColorTransform=new ColorTransform();color_trans.redMultiplier=0;color_trans.greenMultiplier=0;color_trans.blueMultiplier=0;color_trans.alphaMultiplier=0;color_trans.redOffset=0;color_trans.greenOffset=0;color_trans.blueOffset=255;color_trans.alphaOffset=255;color_rect2.transform.colorTransform=color_trans;/操作color_rect3color_rect3.transform.colorTransform=new ColorTransform(1,1,1,1,0,0,0,0);/前四个参数为multi,后四个参数为offset,顺序RGBA(3)运行后,舞台显示输出如图8-10所示。 图8-9 建立三个彩色MovieClip 图8-10 对象获得新的颜色8.3.4 代码分析在这段代码中,对三个矩形对象尝试采用不同的处理方法。(1)对于color_rect1,使用直接设置alpha值的办法,使其半透明。(2)对于color_rect2,采用强大的 colorTransform对象,按照标准步骤对其进行操作。因为不能直接操作其内部colorTransform对象,代码先创建了一个自定义 colorTransform对象color_trans,依次设置color_trans的各属性,并替换color_rect2的内部 ColorTransform对象,改变color_rect2的颜色。(3)对于color_rect3,直接使用 colorTransform构造函数创建了一个无名colorTransform对象,并替换color_rect3的内部 colorTransform对象。这种写法的优点在于代码简单直观,但是因为无名对象的属性和方法不能随意访问,在较复杂的场合,会增加代码的维护成 本。如果需要使用这种写法,应尽量为语句撰写清楚的注释。从细节做起,逐步养成良好的代码写作风格。8.3.5 调色技巧灵活使用ColorTransform类可以调出计 算机显示系统中的任何一种颜色。通过把redmulti、greenmulti、bluemulti、和alphamulti设为0,就可以完全清除显示 对象的原有颜色。然后设置redoffset、greenoffset、blueoffset和alphaoffset,相当于为显示对象创建了一个新颜 色。而精细的修正redmulti、greenmulti、bluemulti和alphamulti的数值,将微量调整显示对象的原有颜色,可以在动画 中达到颜色的自然过渡。灵活使用ColorTransform类还能营造出特殊的效果。要清空一个通道,只需要把相应的multi参数和offset设为零即可。对于多种色彩构成的显示对象,可以通过ColorTransform类的变换,取出某一个通道,清空某一个通道。达到特殊的视觉效果。需要特别指出的是,前例中的 colorTransform色彩调整只是应用到显示对象的运行时内存副本中,并没有改变库中元件的固有颜色。当再一次使用ColorTransform 类调整显示对象时,并不是对前一次调整后的内存副本的颜色做操作,而是重新对库中color_rect元件的固有颜色作调整,然后把调整后的结果复制到显 示内存中。这种机制是必要的,可以有效避免颜色管理的混乱。当使用ColorTransform类变换对象颜色之后,如果需要恢复对象原有的颜色,只要为对象的transform.colorTransform属性赋一个null值。这时AS3的执行引擎会重新复制对象的原始数据到显示内存中。ColorTransform类不能调整影片的背景色,如需要此类设置请参考第6章Stage类的相关内容。8.3.6 闪动动画掌握了AS3定时器和对显示对象基本属性的控制之后,就完成了动画脚本控制的知识储备。综合运用这些知识,能控制对象的轨迹,便创建简单的动画。令一个显示对象动起来,最简单的效果是闪动。闪动动画的原理相对简单:舞台上的显示对象间隔一定时间在隐藏和显示状态切换。代码编写时,需要重点考虑的是:选择何种隐藏显示动画对象的方法。控制对象显示隐藏的方法如表8-2所示。表8-2 控制显示对象显示隐藏的常见方法名 称详 情显示列表法通过添加和删除方法维护显示列表只有添加在显示列表中的显示对象才会显示对象从列表中移除后,将不可见visible属性法将显示对象的visible属性设置为true或者false达到显示或者隐藏对象的目的alpha属性法显示:设置显示对象alpha值为1隐藏:设置显示对象alpha值为0移出舞台法获得Stage的大小,将显示对象的位置移到舞台之外对象遮挡法利用对象的高低层关系,令上层对象遮蔽下层对象,达到下层对象隐藏的目的下面对各种方法的优缺点和适用场合做详细说明。1显示列表法显示列表是AS3中引入的新概念。任何显示对象,必 须使用“addChild()”方法添加到显示列表中,方才可以在舞台上显示。相反,如果使用“removeChild()”方法或者 “removeChildAt()”方法将显示对象从显示列表中删除,则能够达到隐藏显示对象的目的。使用这种方法不应该仅是因为它相当“时髦”,更重要 的着眼点是:它将移除该显示对象的所有子树。所以在某些场合,显示对象法在代码编写的角度上看,是相当便捷高效的。只需要很短的代码,就可以控制众多的对 象。但是在运行的开销上,该方法要重建显示列表,对显示内存进行多次读出和写入,开销相对较大。2visible属性法该方法通过设置显示对象的visible属性为 false,通知Flash的显示引擎在渲染时忽略该项目的渲染,达到隐藏显示对象的目的。显示对象在隐藏期间,在舞台上也是确切存在的,依然保有其位 置,颜色,透明度等属性。由于不需要修改显示列表,该方法的运行开销是最小的。3alpha属性法该方法的特点是较为灵活。它不仅可以实现显示对象的显示和隐藏,还可以令对象产生半透明状态。当一个物体逐渐消失和逐渐显示的时候,必须使用alpha属性控制。在诸多特效变幻中,淡入淡出效果是最常见的。至于alpha变化的运行时开销,则完全不要太过担 心,因为它是硬件加速的。因为现代处理器,包括所有Intel奔腾II以上级别、AMDK6_II以上级别,以及xScale系列掌上设备处理器,对操作 透明度变化的运算都进行了指令集优化,所以在目前大多数的平台上,即使没有图形加速卡,这种alpha效果的运行开销也比较小。许多显示对象一起使用透明 度变化也不会构成显示瓶颈。4移出舞台法该方法可以实现显示和隐藏对象的目的,但是其运行效率相当低,在早先的Flash版本中,移出舞台的动画对象依然全额耗费运行资源。在AS3的引擎中,对这种情况有所改善,但并不理想。除了在动画中切实需要,否则绝不要使用这种方案。而且即使出于动画需要,必须使用该方法。在对象移动到场景外之后,也最好立刻使用visible方法将其隐藏,以节省开销。在复杂动画项目中,这种开销的节约是很重要的。5对象遮挡法在早期的版本中,显示元件有一个层的概念:上层对象 遮盖下层对象。层机制在AS3中已经被显示列表索引机制淘汰。显示列表中,索引序号靠前的对象会首先绘制,将被索引序号靠后的对象遮蔽。使用 “setChildindex()”方法修改显示对象在显示列表中的索引位置,就能达到显示和隐藏显示对象的目的。同移除舞台法相似,该方法开销依然很 大。但是在很多场合,这是最为便捷的方法。例如,在一个视频播放器中,其播放、停止、声音、进 度等诸多元素构成了控制面板,因为某些原因,这些对象不能封包在一个显示对象容器里,而是必须和视频对象并列。对这种情况,当视频全屏播放时,要逐个操作 控制面板众多对象的显示和隐藏,是非常烦琐的。而使用对象遮挡法,只要把视频对象移动到显示列表的末尾,就能隐藏控制面板了。当用户执行某种操作后,再将 视频对象移动到控制面板对象之前,就能显示控制面板。在代码编写时也比较方便。对于闪动效果,虽然visible方法开销更小,但是其状态过于简单,难于创建高级效果。而alpha属性法不仅运行开销小,而且属性取值精密,适合将来扩展为更丰富的动画效果,所以选择alpha属性法实现闪动效果是最明智的。8.3.7 实现闪动效果下面通过实例8-4来实现闪动效果。(1)建立一个AS3项目,帧率设为20,并在舞台上创建一个名为animObject1的MovieClip对象实例,如图8-11所示。(2)在代码编辑器中,输入以下代码,创建一个定时器。var animTimer:Timer = new Timer(50, 100);animTimer.addEventListener(timer, animTimerHandler);animTimer.start();function animTimerHandler(event:TimerEvent):void /动画代码编写入口以上代码创建了一个名为animTimer的定时器,该定时器间隔50毫秒触发一次,总触发次数为100次,动画总计将持续5秒。图8-11 实例animObject1(3)在代码中的“动画代码编写入口”处,添加语句。if(animObject1.alpha=1) animObject1.alpha=0;else animObject1.alpha=1;该段语句控制对象 animObject1的alpha属性。当animObject1.alpha等于1时,代码将会把animObject1.alpha设置为0,这时 animObject1对象将从舞台上消失;当animObject1.alpha不为1时,代码将animObject1.alpha设置为1,对象就 会在舞台上显示。因为该段语句会伴随定时器的触发周期执行,所以将形成对象的闪动动画效果。这段代码可以改写为更简单的形式:animObject1.alpha=(animObject1.alpha=1?0:1);其中 “animObject1.alpha=(animObject1.alpha=1?0:1);”一句,通过使用?:符,简化了if()语句。当 animObject1.alpha值为1时,条件语句animObject1.alpha=1结果为true,则为赋值符左侧对象赋予0值。(4)运行,可以观察到对象animObject1持续闪动。动画运行5秒钟后自动停止。其轨迹图像如图8-12所示。图8-12

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论