在这里我先介¾l一下Flex里é¢çš„动ç”ÀL•ˆæžœæœºåˆÓž¼Œåœ¨Flex里é¢è¦ä‹É用动ç”ÀL•ˆæžœçš„è¯ï¼Œå…ˆè¦åˆ›å¾ä¸€ä¸ªæ•ˆæžœæ ‡½{¾ï¼Œä¹‹åŽåœ¨ç»„仉™‡ŒåQˆå¦‚TextInputåQ‰å†™ä¸Šæ•ˆæžœè§¦å‘器åQŒä½†å¯èƒ½ä¼?x¨¬)有人问åQŒå¦‚果程åºé‡Œæˆ‘å°±åªå®šä¹‰ä¸€ä¸ªç§»åŠ¨æ•ˆæž?br />
<mx:Move>åQŒä¹‹åŽæˆ‘½E‹åºé‡Œé¢æœ?个组ä»Óž¼Œæ¯ä¸ª¾l„äšg的动ç”ÀL•ˆæžœéƒ½æŒ‡å‘˜q™ä¸ªMove效果åQŒé‚£ä¹ˆå®ƒæ˜¯ä¸æ˜¯ç»„件一˜q行了效果åŽåQŒç»„件二å†è§¦å‘æ•ˆæžœï¼Œæ˜¯ä¸æ˜¯ç»„件一的效果会(x¨¬)消失æ‰ä¼š(x¨¬)åˆ°ç»„ä»¶äºŒé‡Œæ’æ”¾ï¼Ÿå…¶å®ƒä¸æ˜¯åQŒè™½ç„¶æˆ‘们åªå®šä¹‰äº†ä¸€ä¸ªMoveåQŒä½†æˆ‘ä»¬å®šä¹‰çš„åªæ˜¯Move效果的工厂,˜q™é‡Œž®Þq”¨åˆîCº†è®¾è®¡æ¨¡å¼ä¸çš„“工厂æ–ÒŽ(gu¨©)³•”模å¼åQŒå…¶å®?个组仉™ƒ½å¯ä»¥åŒæ—¶˜q行效果åQŒè€?个效果都是ä¸åŒçš„一个实例,彼æ¤ç‹¬ç«‹ã€‚所谓工厂方法模å¼ï¼Œž®±å¥½æ¯”是一家衣æœåˆ¶é€ 工厂,Aèµ°è¿›˜q™å®¶å·¥åŽ‚è¯´è¦ä¸€ä»¶è¡£æœï¼Œå·¥åŽ‚ž®±åˆ¶ä½œä¸€ä»¶åˆé€‚Açš„Size的衣æœï¼ŒB˜q›åŽ»åQŒå°±ä¼?x¨¬)生产åˆé€‚B的衣æœï¼Œä½†A与B的衣æœéƒ½æ˜¯ä¸€æ ïL(f¨¥ng)š„。就好ç‰äºŽé¢å‘对象ä¸çš„ç±»ä¸Žå¯¹è±¡çš„å…³ç³»ä¸€æ —÷€‚(我å¯èƒ½è¯´å¤šäº†-_-åQ?br />
效果˜q行的时候,其实˜qè¡Œçš„ä¸æ˜¯Move˜q™ä¸ªå¯¹è±¡åQŒè€Œæ˜¯MoveInstance˜q™ä¸ªå¯¹è±¡åQŒMoveåªæ˜¯å·¥åŽ‚åQŒæ—¢ç„¶ä¸€ä¸ªåЍç”ÀL•ˆæžœå°±ä¸»è¦åˆ†è¿™ä¸¤å¤§éƒ¨ä†¾åQŒæˆ‘们就先å¾é€ 一个工厂å§åQ?br />
在Flexé‡Œé¢æ‰€æœ‰çš„æ•ˆæžœçš„工厂都是ç‘ô承自 mx.effects.Effect ˜q™ä¸ª¾c»ï¼Œæˆ‘们也ä¸èƒ½æžç‰ÒŽ(gu¨©)®ŠåQŒæˆ‘们自定义的效果也è¦ç‘ô扉K‚£ä¸ªç±»åQŒå…ˆçœ‹ä»¥ä¸‹æ•´ä¸ªå·¥åŽ‚ç±»çš„ä»£ç :(x¨¬)
1 package com.jiangzone.flex.effects {
2 import mx.effects.Effect;
3 import mx.effects.EffectInstance;
4
5 public class MyEffect extends Effect {
6 private var _color:Number = 0xFF0000;
7
8 public function set color(value:Number):void {
9 _color = value;
10 }
11
12 public function MyEffect(newTarget:Object = null) {
13 super(newTarget);
14 instanceClass = MyEffectInstance;
15 }
16
17 override public function getAffectedProperties( ):Array {
18 return [];
19 }
20
21 override protected function initInstance(instance:EffectInstance):void {
22 super.initInstance(instance);
23 MyEffectInstance(instance).color = _color;
24 }
25 }
26 }
大家看看上é¢çš„代ç ,其ä¸å…ˆçœ‹æž„é€ å‡½æ•ŽÍ¼Œæž„é€ å‡½æ•°è¦æŽ¥æ”¶ä¸€ä¸ªé»˜è®¤äØ“(f¨´)½Iºçš„Object对象
public function MyEffect(newTarget:Object = null)
之åŽåœ¨è¯¥æž„é€ å‡½æ•°é‡Œé¢è°ƒç”¨çˆ¶¾cÈš„æž„é€ å‡½æ•ŽÍ¼Œòq¶ä¸”ž®†instanceClass˜q™ä¸ªå±žæ€§è®¾¾|®äØ“(f¨´)ä½ çš„è¯¥æ•ˆæžœçš„å®žä¾‹¾c»ï¼Œå› 䨓(f¨´)˜q™ä¸ª¾cÀL˜¯å·¥åŽ‚¾c»ï¼Œæ‰€ä»¥è¦çŸ¥é“ä½ è¿™ä¸ªå·¥åŽ‚ç”Ÿäº§ä»€ä¹ˆäñ”å“,å³ä¸Šé¢è¯´çš?#8220;衣朔åQŒæ‰€ä»¥è¿™é‡Œæˆ‘们将其命å䨓(f¨´)MyEffectInstanceåQŒæ³¨æ„:(x¨¬)在Flexä¸çš„æ‰€æœ‰æ•ˆæžœå®žä¾‹ç±»éƒ½æ˜¯åœ¨å·¥åŽ‚ç±»åŽé¢åŠ InstanceåQŒä¹Ÿä¸æ˜¯ä¸€å®šï¼Œåªæ˜¯è§„范而已。还有注æ„,下é¢ä¸€ä¼?x¨¬)定义的实例¾cÈš„¾cÕd一定è¦è·Ÿè¿™é‡Œçš„一致ã€?br />
大家˜q˜ä¼š(x¨¬)看到åQŒä¸Šé¢çš„代ç ä¸ï¼Œå¤å†™åQˆoverrideåQ‰äº†äºŒä¸ªæ–ÒŽ(gu¨©)³•åQšgetAffectedProperties( )与initInstance(instance:EffectInstance)
˜q™ä¸¤ä¸ªæ–¹æ³•都是è¦å¤å†™çš„,先说说getAffectedProperties( )˜q™ä¸ªæ–ÒŽ(gu¨©)³•åQŒè¿™ä¸ªæ–¹æ³•是获å–被改å˜çš„属性å€û|¼Œæ€Žä¹ˆè¯´å‘¢åQŒæ¯”如说åQŒä½ åšçš„动画效果如果è¦ç”¨åˆ°ç»„件对象的一些属性的è¯ï¼Œž®Þp¦˜q”回˜q™äº›å±žæ€§çš„åå—åQŒå¦‚åQšä½ çš„æ•ˆæžœæ˜¯å¯¹ç»„ä»¶åšæ—‹è{çš„è¯åQŒåˆ™åQ?br />
1 override public function getAffectedProperties( ):Array {
2 return ["rotation"];
3 }
åæ£ä½ åšçš„æ•ˆæžœéœ€è¦å¯¹¾l„äšg修改什么属性的è¯ï¼Œéƒ½åœ¨˜q™ä¸ªæ–ÒŽ(gu¨©)³•里返回åå—,修改多个属性的è¯å°±å¾€æ•°ç»„é‡ŒåŠ ž®±æ˜¯äº†ã€?br />
åŽé¢ž®±æ˜¯˜q™ä¸ªæ–ÒŽ(gu¨©)³•了initInstanceåQŒè¯¥æ–ÒŽ(gu¨©)³•接收一个instance:EffectInstance傿•°åQŒä¹Ÿž®±æ˜¯æ•ˆæžœå®žä¾‹¾cÕd•¦åQŒå› 为æ¯ä¸ªæ•ˆæžœå®žä¾‹ç±»éƒ½è¦¾l§æ‰¿EffectInstance¾c»ï¼Œæ‰€ä»¥è¿™ä¸ªæ–¹æ³•é‡Œçš„å‚æ•°å†™çš„æ˜¯çˆ¶ç±»åQŒåœ¨é‡Œé¢è¦åšå…¶å®ƒçš„è¯åQŒéœ€è¦å°† instance 转æ¢ä¸ÞZ½ 相应的效果类。在˜q™ä¸ªæ–ÒŽ(gu¨©)³•里é¢åQŒä¹Ÿæ˜¯è¦è°ƒç”¨çˆ¶ç±»çš„åŒå方法:(x¨¬)super.initInstance(instance);
基本上,一个工厂类ž®±å†™å¥½äº†åQŒä½†˜q™æ ·åªæ˜¯æœ€½Ž€å•的写法åQŒè¯•æƒÏxƒ³åQŒæ¯ä¸ªäh½I¿è¡£æœçš„Sizeä¸åŒåQŒå–œ‹Æ¢çš„颜色也ä¸åŒï¼Œæ‰€ä»¥ï¼Œæ˜¯ä¸æ˜¯å¯ä»¥ç”±ç”¨æˆ·æ¥å®šä¹‰ä»–们想è¦çš„æ•ˆæžœçš„颜色ç‰å±žæ€§å‘¢åQŸå½“ç„Óž¼Œä½ å¯¹è¡£æœæœ‰ä»€ä¹ˆè¦æ±‚,都是å‘工厂æå‡ºçš„åQŒæ²¡æœ‰ähä¼?x¨¬)对衣æœè¯´å§åQŸæ‰€ä»¥ï¼Œ˜q™äº›å¯è®¾¾|®çš„属性也是定义在工厂¾c»é‡Œé¢ï¼Œæ‰€ä»¥ä¸‹é¢ï¼Œæˆ‘们䏸™¯¥è¡£æœå¯å®šåˆ‰™¢œè‰²äØ“(f¨´)例,在工厂类里é¢åР入如䏋代ç åQ?br />
1 private var _color:Number = 0xFF0000;
2 public function set color(value:Number):void {
3 _color = value;
4 }
ä½ æƒ³˜q行时的效果å¯ä»¥è®„¡½®ä¸åŒçš„颜色的è¯ï¼Œž®±å¯ä»¥ç›´æŽ¥è®¾¾|®MyEffectçš„color属性,之厞®†è¿™ä¸ªå±žæ€§ä¼ ¾l™æ•ˆæžœå®žä¾‹ç±»åQ?br />
1 override protected function initInstance(instance:EffectInstance):void {
2 super.initInstance(instance);
3 MyEffectInstance(instance).color = _color;
4 }
˜q™äº›å¯ÒŽ(gu¨©)•ˆæžœå®žä¾‹ç±»çš„设¾|®ï¼Œéƒ½æ˜¯è¦å®šåœ¨initInstanceæ–ÒŽ(gu¨©)³•里了åQŒä½ 惛_¯¹˜q行时的效果讄¡½®ä»€ä¹ˆå±žæ€§çš„è¯ï¼Œéƒ½è¦å…ˆå‘Šè¯‰å·¥åŽ‚ç±»åQŒä¹‹åŽå·¥åŽ‚ç±»åœ¨è¿™ä¸ªæ–¹æ³•é‡Œé¢è{å«ç»™å®žä¾‹¾c»ï¼Œ˜q™æ ·åQŒåŒä¸€ä¸ªæ•ˆæžœï¼Œå¯ä»¥˜q行ä¸åŒçš„颜艌Ӏ‚ä½†å‰ææ˜¯ä½ åŽé¢è¦å†™çš„å®žä¾‹ç±»è¦æœ‰color˜q™ä¸ªå±žæ€§ã€?br />
现在已åšå¥½äº†å·¥åŽ‚¾cÖMº†åQŒä¸‹é¢è¦åšæ•ˆæžœå®žä¾‹ç±»äº†ï¼Œå…ˆè„“(chu¨¤ng)出完整代ç :(x¨¬)
1 package com.jiangzone.flex.effects {
2 import mx.effects.EffectInstance;
3 import flash.display.Shape;
4 import flash.events.Event;
5
6 public class MyEffectInstance extends EffectInstance {
7
8 private var _color:Number;
9 private var shape:Shape;
10
11 public function set color(value:Number):void {
12 _color = value;
13 }
14
15 public function MyEffectInstance(newTarget:Object) {
16 super(newTarget);
17 }
18
19 override public function play( ):void {
20 super.play( );
21 drawShape();
22 }
23
24 private function drawShape():void{
25 shape = new Shape();
26 shape.graphics.beginFill(_color);
27 shape.graphics.drawRect(target.width * -0.5,target.height * -0.5,target.width,target.height);
28 shape.graphics.endFill();
29 shape.x = target.x + target.width * 0.5;
30 shape.y = target.y + target.height * 0.5;
31 target.parent.rawChildren.addChild(shape);
32 target.addEventListener(Event.ENTER_FRAME,onEnterFrame);
33 }
34
35 private function onEnterFrame(e:Event):void{
36 shape.scaleX += 0.1;
37 shape.scaleY += 0.1;
38 shape.alpha -= 0.05;
39 if(shape.alpha <= 0){
40 target.parent.rawChildren.removeChild(shape);
41 target.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
42 }
43 }
44 }
45 }
我们看到åQŒæ¯ä¸€ä¸ªåЍç”ÀL•ˆæžœå®žä¾‹ç±»åQŒéƒ½è¦ç‘ô承自EffectInstance˜q™ä¸ª¾c»ï¼Œæž„é€ å‡½æ•îC¹Ÿæ˜¯éœ€è¦æŽ¥æ”¶ä¸€ä¸ªObjectåQŒè¿™ä¸ªObject其实ž®±æ˜¯ä½ è¦åº”用到的¾l„äšg对象åQŒè¿™ä¸ªä¼š(x¨¬)是系¾lŸè‡ªåŠ¨ä¼ é€’çš„åQŒæŽ¥æ”¶äº†ObjectåŽè¿˜è¦ç”¨è¯¥Object è°ƒç”¨çˆ¶ç±»çš„æž„é€ å‡½æ•ŽÍ¼š(x¨¬)super(newTarget);
之厘q˜æœ‰ä¸€ä»¶å¿…åšçš„事,ž®±æ˜¯é‡å†™play()˜q™ä¸ªæ–ÒŽ(gu¨©)³•åQšoverride public function play( ):void
æ˜¯ä¸æ˜¯å¯¹play()很熟æ‚(zh¨¨n)‰ï¼Ÿå› 䨓(f¨´)½W¬ä¸€½‹‡æ–‡ç« ä¸åQŒå°±ç”¨åˆ°˜q™ä¸ªæ–ÒŽ(gu¨©)³•æ¥å‘åŠ¨æ•ˆæžœçš„æ’æ”¾çš„ï¼Œæ‰€ä»¥ï¼Œä½ éœ€è¦åšçš„动ç”ȼ–½E‹éƒ½æ˜¯åœ¨˜q™ä¸ªæ–ÒŽ(gu¨©)³•里。但˜q˜æ˜¯è¦å…ˆè°ƒç”¨çˆ¶ç±»çš„åŒå方法,super.play();之åŽçš„,ž®±æ˜¯ä½ 想怎么ç”Õd°±æ€Žä¹ˆç”Õd•¦ã€‚我ž®†ç”»ä¸€ä¸ªä¸Žè¦åº”用效果的¾l„äšgä¸€æ ·å¤§ž®çš„矩型åQŒä¹‹åŽè¯¥çŸ©åÅžä¼?x¨¬)æ”¾å¤§åÆˆé€æ˜ŽåQŒæ•ˆæžœéƒ½å†™åœ¨drawShape()æ–ÒŽ(gu¨©)³•里了。看到这个方法里é¢çš„代ç åQŒæ˜¯ä¸æ˜¯è·ŸFlashé‡Œçš„ä¸€æ ·äº†åQ?br />
˜q™é‡Œå†è„“(chu¨¤ng)上MXML代ç åQ?br />
1 <?xml version="1.0" encoding="utf-8"?>
2 <mx:Application layout="absolute" xmlns:mx="http://www.adobe.com/2006/mxml"
3 xmlns:pf="com.jiangzone.flex.effects.*">
4 <pf:MyEffect id="myEffect" color="0xFFFFFF" />
5 <mx:VBox x="100" y="43">
6 <mx:TextInput focusInEffect="{myEffect}" />
7 <mx:TextInput focusInEffect="{myEffect}" />
8 <mx:TextInput focusInEffect="{myEffect}" />
9 <mx:TextInput focusInEffect="{myEffect}" />
10 </mx:VBox>
11 </mx:Application>
˜q™é‡Œå…ˆçœ‹çœ‹æœ€¾lˆæ•ˆæžœï¼š(x¨¬)
在这里,我用了ENTER_FRAME的写法,但是如果ä¸ç”¨ENTER_FRAMEæ–¹å¼åˆ¶ä½œåŠ¨ç”»çš„è¯åQŒè¿˜æœ‰å¦å¤–一¿U方法的åQŒé‚£ž®±æ˜¯Tween了,Tween是以“æ—‰™—´”为准åQŒè€ŒENTER_FRAME是以“å¸?#8221;为准åQŒå…¶å®žåˆ°˜q™é‡ŒåQŒä¸€ä¸ªåŸºæœ¬çš„Flex自定义动ç”ÀL•ˆæžœå°±å®Œæˆäº†ï¼Œä½†æ‰©å±•一下的åQŒè¿˜å¯ä»¥ç”¨Tweenæ¥å®žçŽŽÍ¼Œè€Œä¸”廸™®®ç”¨Tweenæ¥å†™åŠ¨ç”»æ•ˆæžœåQŒæ˜“控制åQŒæ¸…淅一ç‚V€‚用Tween实现的è¯åQŒæ•ˆæžœä¸Žå†™æ³•都是差ä¸å¤šçš„åQŒè¦ç”¨Tweenž®Þp¦ž®†æ•ˆæžœå®žä¾‹ç±»¾l§æ‰¿è‡ªTweenEffectInstance˜q™ä¸ª¾c»ï¼Œòq‰™‡å†™å®ƒçš„onTweenUpdate( )æ–ÒŽ(gu¨©)³•与onTweenEnd( )æ–ÒŽ(gu¨©)³•åQŒè¿™¿UTween效果的写法,ž®†ä¼š(x¨¬)比ENTER_FRAMEçš„å†™æ³•æ–¹ä¾¿ï¼Œå› äØ“(f¨´)å®ƒæ ¹æ®çš„æ˜¯æ—¶é—ß_(d¨¢)¼Œæ‰€ä»¥ï¼Œä½ å¯ä»¥æŒ‡å®šæ•ˆæžœæ’攄¡š„æ—‰™—´åQŒåÆˆä¸”å½“æ’æ”¾å®Œæ¯•ä¼?x¨¬)自动调用onTweenEnd()æ–ÒŽ(gu¨©)³•åQŒä½ å¯ä»¥åœ¨è¯¥æ–ÒŽ(gu¨©)³•é‡Œå†™ä¸€äº›å¤„ç†æ“作,如释放资æºç‰½{?br />
ç”׃ºŽ¾~–幅关系åQŒå°±ä¸åœ¨˜q™é‡Œè¯¦ç»†ä»‹ç»TweenEffectInstence了,ž®Þq®€å•è„“(chu¨¤ng)凸™¯¥¾cÈš„写法与注释å§åQ?br />
1 package com.jiangzone.flex.effects {
2 import mx.effects.effectClasses.TweenEffectInstance;
3 import flash.display.Shape;
4 import flash.events.Event;
5 import mx.effects.Tween;
6
7 public class MyEffectInstance extends TweenEffectInstance {
8
9 private var _color:Number;
10 private var shape:Shape;
11
12 public function set color(value:Number):void {
13 _color = value;
14 }
15
16 //æž„é€ å‡½æ•?/span>
17 public function MyEffectInstance(newTarget:Object) {
18 super(newTarget);
19 }
20
21 //åŒæ ·çš„è¦é‡å†™play()æ–ÒŽ(gu¨©)³•与调用父¾cÕdŒåæ–¹æ³?/span>
22 override public function play( ):void {
23 super.play();
24 drawShape(); //先创å»ÞZ¸€ä¸ªçŸ©å½?/span>
25 /*注æ„åQšç”¨Tween效果写法的è¯åQŒå°±ä¸€å®šè¦åˆ›å¾ä¸€ä¸ªTween对象
26 ½W¬ä¸€ä¸ªå‚数是侦å¬å™¨ï¼Œå³ä¾¦å¬Update与End的,˜q™ä¸¤ä¸ªæ–¹æ³•都在这个类里,
27 所以这里就写this,½W¬äºŒå’Œç¬¬ä¸‰ä¸ªå‚数都是一个数¾l?br />
28 ½W¬äºŒä¸ªå‚数是åˆå§‹å€¼æ•°¾l„,½W¬ä¸‰ä¸ªæ˜¯¾l“果值数¾l„,都è¦ä¸€ä¸€å¯¹åº”åQŒç¬¬å››ä¸ªæ˜¯å˜åŒ–æ—¶é—?br />
29 ˜q™é‡Œçš„æ˜¯[1,1]分别是åˆå§‹æ—¶çš„scale比例与alphaåQŒ[3,0]ž®±æ˜¯æœ€¾lˆç»“果数å€?br />
30 ¾pÈ»Ÿä¼?x¨¬)自动åœ?000毫秒里åã^分这些值æ¥å¾—到æ¸å˜æ•ˆæžœ
31 òq¶å°†æ¯ä¸€‹Æ¡æ•°å€¼çš„æ”¹å˜æ—¶è°ƒç”¨Updateæ–ÒŽ(gu¨©)³•åQŒç»“æŸåŽè°ƒç”¨Endæ–ÒŽ(gu¨©)³•
32 ä½ ä¹Ÿå¯ä»¥ž®†æ—¶é—´çš„傿•°å‘布到工厂类属性里åQŒå¯ä»¥æ–¹ä¾¿è®¾¾|®æ’放时é—ß_(d¨¢)¼ŒåƒFlex自带效果一æ ?br />
33 */
34 new Tween(this,[1,1],[3,0],1000);
35 }
36
37 override public function onTweenUpdate(value:Object):void{
38 //˜q™é‡Œž®†æ”¹å˜çš„æ•°å€¼åº”用到¾l„äšg对象ä¸ã€‚注æ„:(x¨¬)也è¦ä¸Žä¸Šé¢çš„æ•°å€¼æ•°¾l„相对应ã€?/span>
39 shape.scaleX = Number(value[0]);
40 shape.scaleY = Number(value[0]);
41 shape.alpha = Number(value[1]);
42 }
43
44 override public function onTweenEnd(value:Object):void {
45 //å½“æ’æ”‘Ö®Œæ—¶ä¼š(x¨¬)自动调用该方法,˜q™é‡Œž®±åšåˆ 除该矩形的æ“作å?/span>
46 target.parent.rawChildren.removeChild(shape);
47 }
48
49 private function drawShape():void{
50 shape = new Shape();
51 shape.graphics.beginFill(_color);
52 shape.graphics.drawRect(target.width * -0.5,target.height * -0.5,target.width,target.height);
53 shape.graphics.endFill();
54 shape.x = target.x + target.width * 0.5;
55 shape.y = target.y + target.height * 0.5;
56 target.parent.rawChildren.addChild(shape);
57 }
58 }
59 }
ž®±å†™åˆ°è¿™é‡Œå§åQŒå…³äºŽTween其它的,ž®Þq•™ä½œäØ“(f¨´)作业åQŒè®©å¤§å®¶æ€è€ƒä¸ŽæŽ¢çƒ¦å§ï¼ä¹‹åŽå¦‚果有时间的è¯ï¼Œž®†ä¼š(x¨¬)å†™å®Œä¸‹ç¯‡æ–‡ç« ä»‹ç»Flexçš?#8220;å˜é¢”动画åQŒå³çжæ€å˜æ¢ï¼˜q™é‡Œå…ˆè°¢è°¢å¤§å®¶æ”¯æŒï¼

]]>