<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-31  評論-257  文章-0  trackbacks-0
    在上篇文章《Flex的動畫效果與變換(一)》中講到了使用Flex系統里面自帶的一些動來效果的使用,但很多開發者都并不滿足Flex里提供的簡單的漸變大小,透明,移動,遮罩等的效果,如果是Flash的開發者的話,更不用說了,在Flash,多數人都是隨意的制作一些動畫效果等,而且形態多變。但是不是Flex里就不能實現呢?肯定不是,在Flex里也可以自定義動畫效果,只不過就是沒有Flash里面那么簡單隨意了。不過熟悉了之后,也會覺得在Flex里制作動畫也不是什么難事,不多說了,轉入正題!

    在這里我先介紹一下Flex里面的動畫效果機制,在Flex里面要使用動畫效果的話,先要創建一個效果標簽,之后在組件里(如TextInput)寫上效果觸發器,但可能會有人問,如果程序里我就只定義一個移動效果
    <mx:Move>,之后我程序里面有5個組件,每個組件的動畫效果都指向這個Move效果,那么它是不是組件一運行了效果后,組件二再觸發效果,是不是組件一的效果會消失才會到組件二里播放?其它不是,雖然我們只定義了一個Move,但我們定義的只是Move效果的工廠,這里就用到了設計模式中的“工廠方法”模式,其實5個組件都可以同時運行效果,而5個效果都是不同的一個實例,彼此獨立。所謂工廠方法模式,就好比是一家衣服制造工廠,A走進這家工廠說要一件衣服,工廠就制作一件合適A的Size的衣服,B進去,就會生產合適B的衣服,但A與B的衣服都是一樣的。就好等于面向對象中的類與對象的關系一樣。(我可能說多了-_-)
    效果運行的時候,其實運行的不是Move這個對象,而是MoveInstance這個對象,Move只是工廠,既然一個動畫效果就主要分這兩大部份,我們就先建造一個工廠吧!

    在Flex里面所有的效果的工廠都是繼承自 mx.effects.Effect 這個類,我們也不能搞特殊,我們自定義的效果也要繼承那個類,先看以下整個工廠類的代碼:
     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 }


    大家看看上面的代碼,其中先看構造函數,構造函數要接收一個默認為空的Object對象
    public function MyEffect(newTarget:Object = null)
    之后在該構造函數里面調用父類的構造函數,并且將instanceClass這個屬性設置為你的該效果的實例類,因為這個類是工廠類,所以要知道你這個工廠生產什么產品,即上面說的“衣服”,所以這里我們將其命名為MyEffectInstance,注意:在Flex中的所有效果實例類都是在工廠類后面加Instance,也不是一定,只是規范而已。還有注意,下面一會定義的實例類的類名一定要跟這里的一致。
    大家還會看到,上面的代碼中,復寫(override)了二個方法:getAffectedProperties( )與initInstance(instance:EffectInstance)
    這兩個方法都是要復寫的,先說說getAffectedProperties( )這個方法,這個方法是獲取被改變的屬性值,怎么說呢,比如說,你做的動畫效果如果要用到組件對象的一些屬性的話,就要返回這些屬性的名字,如:你的效果是對組件做旋轉的話,則:
    1 override public function getAffectedProperties( ):Array {
    2     return ["rotation"];
    3 }

    反正你做的效果需要對組件修改什么屬性的話,都在這個方法里返回名字,修改多個屬性的話就往數組里加就是了。
    后面就是這個方法了initInstance,該方法接收一個instance:EffectInstance參數,也就是效果實例類啦,因為每個效果實例類都要繼承EffectInstance類,所以這個方法里的參數寫的是父類,在里面要做其它的話,需要將 instance 轉換為你相應的效果類。在這個方法里面,也是要調用父類的同名方法:super.initInstance(instance);
    基本上,一個工廠類就寫好了,但這樣只是最簡單的寫法,試想想,每個人穿衣服的Size不同,喜歡的顏色也不同,所以,是不是可以由用戶來定義他們想要的效果的顏色等屬性呢?當然,你對衣服有什么要求,都是向工廠提出的,沒有人會對衣服說吧?所以,這些可設置的屬性也是定義在工廠類里面,所以下面,我們為該衣服可定制顏色為例,在工廠類里面加入如下代碼:
    1 private var _color:Number = 0xFF0000;
    2 public function set color(value:Number):void {
    3         _color = value;
    4 }

    你想運行時的效果可以設置不同的顏色的話,就可以直接設置MyEffect的color屬性,之后將這個屬性傳給效果實例類:
    1 override protected function initInstance(instance:EffectInstance):void {
    2     super.initInstance(instance);
    3         MyEffectInstance(instance).color = _color;
    4 }

    這些對效果實例類的設置,都是要定在initInstance方法里了,你想對運行時的效果設置什么屬性的話,都要先告訴工廠類,之后工廠類在這個方法里面轉嫁給實例類,這樣,同一個效果,可以運行不同的顏色。但前提是你后面要寫的實例類要有color這個屬性。
    現在已做好了工廠類了,下面要做效果實例類了,先貼出完整代碼:
     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 }


    我們看到,每一個動畫效果實例類,都要繼承自EffectInstance這個類,構造函數也是需要接收一個Object,這個Object其實就是你要應用到的組件對象,這個會是系統自動傳遞的,接收了Object后還要用該Object 調用父類的構造函數:super(newTarget);
    之后還有一件必做的事,就是重寫play()這個方法:override public function play( ):void
    是不是對play()很熟悉?因為第一篇文章中,就用到這個方法來發動效果的播放的,所以,你需要做的動畫編程都是在這個方法里。但還是要先調用父類的同名方法,super.play();之后的,就是你想怎么畫就怎么畫啦。我將畫一個與要應用效果的組件一樣大小的矩型,之后該矩形會放大并透明,效果都寫在drawShape()方法里了。看到這個方法里面的代碼,是不是跟Flash里的一樣了?
    這里再貼上MXML代碼:
     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>

    這里先看看最終效果:


    在這里,我用了ENTER_FRAME的寫法,但是如果不用ENTER_FRAME方式制作動畫的話,還有另外一種方法的,那就是Tween了,Tween是以“時間”為準,而ENTER_FRAME是以“幀”為準,其實到這里,一個基本的Flex自定義動畫效果就完成了,但擴展一下的,還可以用Tween來實現,而且建議用Tween來寫動畫效果,易控制,清淅一點。用Tween實現的話,效果與寫法都是差不多的,要用Tween就要將效果實例類繼承自TweenEffectInstance這個類,并重寫它的onTweenUpdate( )方法與onTweenEnd( )方法,這種Tween效果的寫法,將會比ENTER_FRAME的寫法方便,因為它根據的是時間,所以,你可以指定效果播放的時間,并且當播放完畢會自動調用onTweenEnd()方法,你可以在該方法里寫一些處理操作,如釋放資源等等
    由于編幅關系,就不在這里詳細介紹TweenEffectInstence了,就簡單貼出該類的寫法與注釋吧:
     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         //構造函數
    17         public function MyEffectInstance(newTarget:Object) {
    18             super(newTarget);
    19         }
    20        
    21         //同樣的要重寫play()方法與調用父類同名方法
    22         override public function play( ):void {
    23             super.play();
    24             drawShape();        //先創建一個矩形
    25             /*注意:用Tween效果寫法的話,就一定要創建一個Tween對象
    26             第一個參數是偵聽器,即偵聽Update與End的,這兩個方法都在這個類里,
    27             所以這里就寫this,第二和第三個參數都是一個數組
    28             第二個參數是初始值數組,第三個是結果值數組,都要一一對應,第四個是變化時間
    29             這里的是[1,1]分別是初始時的scale比例與alpha,[3,0]就是最終結果數值
    30             系統會自動在1000毫秒里平分這些值來得到漸變效果
    31             并將每一次數值的改變時調用Update方法,結束后調用End方法
    32                     你也可以將時間的參數發布到工廠類屬性里,可以方便設置播放時間,像Flex自帶效果一樣
    33                          */
    34             new Tween(this,[1,1],[3,0],1000);
    35         }
    36        
    37         override public function onTweenUpdate(value:Object):void{
    38             //這里將改變的數值應用到組件對象中。注意:也要與上面的數值數組相對應。
    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             //當播放完時會自動調用該方法,這里就做刪除該矩形的操作吧
    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 }


    就寫到這里吧,關于Tween其它的,就留作為作業,讓大家思考與探索吧!之后如果有時間的話,將會寫完下篇文章介紹Flex的“變面”動畫,即狀態變換!這里先謝謝大家支持!
    posted on 2008-07-29 14:24 姜大叔 閱讀(5679) 評論(7)  編輯  收藏 所屬分類: Flash/Flex

    評論:
    # re: Flex的動畫效果與變換?。ǘ未登錄] 2009-02-03 15:36 | kiss
    寫的非常好,學習了  回復  更多評論
      
    # re: Flex的動畫效果與變換?。ǘ未登錄] 2009-03-26 12:04 | wei
    flex真麻煩  回復  更多評論
      
    # re: Flex的動畫效果與變換?。ǘ? 2009-08-17 22:28 | zonebond宇
    還是flash好用!  回復  更多評論
      
    # re: Flex的動畫效果與變換!(二) 2009-10-22 09:52 | MSSK
    正需要這方面資料,非常感謝!!  回復  更多評論
      
    # re: Flex的動畫效果與變換?。ǘ未登錄] 2010-06-13 15:17 | jinn
    構造參數有問題。。。  回復  更多評論
      
    # re: Flex的動畫效果與變換?。ǘ未登錄] 2012-05-09 13:19 | 王斌
    樓主辛苦了!  回復  更多評論
      
    # re: Flex的動畫效果與變換?。ǘ?a name="Post"> 2014-05-14 17:13 | 不對
    <pf:MyEffect id="myEffect" color="0xFFFFFF" />

    1046: 找不到類型,或者它不是編譯時常數: MyEffect。

    而且類里有很明顯的錯誤。。有點誤人子弟、  回復  更多評論
      
    主站蜘蛛池模板: 最近中文字幕免费mv视频8| 免费人人潮人人爽一区二区 | 青青草免费在线视频| 亚洲天堂一区二区| 免费看又黄又无码的网站| 亚洲国产精品VA在线看黑人 | 亚洲av无码国产精品色午夜字幕| 中文毛片无遮挡高清免费| 国产午夜亚洲精品国产成人小说| 一个人晚上在线观看的免费视频| 亚洲欧洲久久av| 99久久国产精品免费一区二区 | 亚洲性色AV日韩在线观看| 成全影视免费观看大全二| 亚洲国产综合AV在线观看| 吃奶摸下高潮60分钟免费视频| 欧美亚洲国产SUV| 亚洲国产天堂久久久久久| 精品熟女少妇aⅴ免费久久| 亚洲第一AAAAA片| 曰曰鲁夜夜免费播放视频 | 免费的黄色网页在线免费观看| 亚洲免费无码在线| 国产拍拍拍无码视频免费| 亚洲精品视频专区| 午夜神器成在线人成在线人免费 | 国产一区视频在线免费观看 | 亚洲熟伦熟女新五十路熟妇| 最新亚洲成av人免费看| 亚洲色图古典武侠| 麻豆国产入口在线观看免费| 和老外3p爽粗大免费视频| 亚洲春色另类小说| 好爽好紧好大的免费视频国产| gogo免费在线观看| 亚洲精品国产专区91在线| 国产裸模视频免费区无码| 成人无码区免费A∨直播| 亚洲av永久综合在线观看尤物| 国产一级大片免费看| 久久午夜无码免费|