隨筆-31  評(píng)論-257  文章-0  trackbacks-0
          這篇文章是Flex動(dòng)畫效果變換的最后一編了,這篇將會(huì)講述Flex中的“變面”(我自已的理解)技術(shù),即是Transitions!

          如果看過Flex SDK里面的自帶的例子程序,有一個(gè)叫“Flex Store”的應(yīng)用,在里面的手機(jī)列表中看某一個(gè)手機(jī)的詳細(xì)時(shí),就是這種效果,不多說(shuō),這篇會(huì)比較簡(jiǎn)單,先看看效果:


          看到了效果了吧,這種的變換不難實(shí)現(xiàn),再來(lái)看看代碼再解析:
           1 <?xml version="1.0" encoding="utf-8"?>
           2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="695" height="555">
           3 <mx:states>
           4 <mx:State name="A">
           5     <mx:SetProperty target="{windowA}" name="width" value="500"/>
           6     <mx:SetProperty target="{windowA}" name="height" value="300"/>
           7     <mx:SetProperty target="{windowC}" name="width" value="150"/>
           8     <mx:SetProperty target="{windowC}" name="height" value="150"/>
           9     <mx:SetProperty target="{windowC}" name="y" value="333"/>
          10     <mx:SetProperty target="{windowD}" name="x" value="373"/>
          11     <mx:SetProperty target="{windowD}" name="width" value="150"/>
          12     <mx:SetProperty target="{windowD}" name="height" value="150"/>
          13     <mx:SetProperty target="{windowD}" name="y" value="333"/>
          14     <mx:SetProperty target="{windowB}" name="x" value="23"/>
          15     <mx:SetProperty target="{windowB}" name="y" value="333"/>
          16     <mx:SetProperty target="{windowB}" name="width" value="150"/>
          17     <mx:SetProperty target="{windowB}" name="height" value="150"/>
          18     <mx:SetProperty target="{windowC}" name="x" value="200"/>
          19 </mx:State>
          20 <mx:State name="B">
          21     <mx:SetProperty target="{windowD}" name="width" value="150"/>
          22     <mx:SetProperty target="{windowD}" name="height" value="150"/>
          23     <mx:SetProperty target="{windowC}" name="width" value="150"/>
          24     <mx:SetProperty target="{windowC}" name="height" value="150"/>
          25     <mx:SetProperty target="{windowA}" name="width" value="150"/>
          26     <mx:SetProperty target="{windowA}" name="height" value="150"/>
          27     <mx:SetProperty target="{windowB}" name="width" value="500"/>
          28     <mx:SetProperty target="{windowB}" name="height" value="300"/>
          29     <mx:SetProperty target="{windowA}" name="y" value="333"/>
          30     <mx:SetProperty target="{windowC}" name="x" value="200"/>
          31     <mx:SetProperty target="{windowC}" name="y" value="333"/>
          32     <mx:SetProperty target="{windowB}" name="x" value="23"/>
          33     <mx:SetProperty target="{windowD}" name="x" value="373"/>
          34     <mx:SetProperty target="{windowD}" name="y" value="333"/>
          35 </mx:State>
          36 <mx:State name="C">
          37     <mx:SetProperty target="{windowD}" name="width" value="150"/>
          38     <mx:SetProperty target="{windowD}" name="height" value="150"/>
          39     <mx:SetProperty target="{windowB}" name="width" value="150"/>
          40     <mx:SetProperty target="{windowB}" name="height" value="150"/>
          41     <mx:SetProperty target="{windowA}" name="width" value="150"/>
          42     <mx:SetProperty target="{windowA}" name="height" value="150"/>
          43     <mx:SetProperty target="{windowC}" name="width" value="500"/>
          44     <mx:SetProperty target="{windowC}" name="height" value="300"/>
          45     <mx:SetProperty target="{windowA}" name="y" value="333"/>
          46     <mx:SetProperty target="{windowB}" name="x" value="200"/>
          47     <mx:SetProperty target="{windowB}" name="y" value="333"/>
          48     <mx:SetProperty target="{windowC}" name="x" value="23"/>
          49     <mx:SetProperty target="{windowC}" name="y" value="19"/>
          50     <mx:SetProperty target="{windowD}" name="x" value="373"/>
          51     <mx:SetProperty target="{windowD}" name="y" value="333"/>
          52 </mx:State>
          53 <mx:State name="D">
          54 <mx:SetProperty target="{windowC}" name="width" value="150"/>
          55 <mx:SetProperty target="{windowC}" name="height" value="150"/>
          56 <mx:SetProperty target="{windowB}" name="width" value="150"/>
          57 <mx:SetProperty target="{windowB}" name="height" value="150"/>
          58 <mx:SetProperty target="{windowA}" name="width" value="150"/>
          59 <mx:SetProperty target="{windowA}" name="height" value="150"/>
          60 <mx:SetProperty target="{windowD}" name="width" value="500"/>
          61 <mx:SetProperty target="{windowD}" name="height" value="300"/>
          62 <mx:SetProperty target="{windowA}" name="y" value="333"/>
          63 <mx:SetProperty target="{windowB}" name="x" value="200"/>
          64 <mx:SetProperty target="{windowB}" name="y" value="333"/>
          65 <mx:SetProperty target="{windowD}" name="x" value="23"/>
          66 <mx:SetProperty target="{windowD}" name="y" value="19"/>
          67 <mx:SetProperty target="{windowC}" name="x" value="373"/>
          68 <mx:SetProperty target="{windowC}" name="y" value="333"/>
          69 </mx:State>
          70 </mx:states>
          71 <mx:transitions>
          72 <mx:Transition fromState="*" toState="*">
          73 <mx:Parallel targets="{[windowA, windowB, windowC, windowD]}">
          74 <mx:Move />
          75 <mx:Resize />
          76 </mx:Parallel>
          77 </mx:Transition>
          78 </mx:transitions>
          79 <mx:TitleWindow x="23" y="19" width="250" height="200" layout="absolute" title="A" id="windowA" click="currentState='A'" />
          80 <mx:TitleWindow x="309" y="19" width="250" height="200" layout="absolute" title="B" id="windowB" click="currentState='B'" />
          81 <mx:TitleWindow x="23" y="260" width="250" height="200" layout="absolute" title="C" id="windowC" click="currentState='C'" />
          82 <mx:TitleWindow x="309" y="260" width="250" height="200" layout="absolute" title="D" id="windowD" click="currentState='D'" />
          83 </mx:Application>


          代碼會(huì)比較多,我們先看看<mx:states>標(biāo)簽,它是一個(gè)集合,就是你的程序有多少個(gè)狀態(tài),什么是狀態(tài)呢?我自已理解就即是有多少個(gè)“面譜”,即是現(xiàn)在程序里面有四個(gè)顯示界面狀態(tài),所以里面有四個(gè)<mx:State>標(biāo)簽,每個(gè)<mx:State>狀態(tài)都需要有一個(gè)名字name屬性,以區(qū)分是哪個(gè)界面狀態(tài),在每個(gè)狀態(tài)里面都有很多<mx:SetProperty>的標(biāo)簽,看英文都知道了,該標(biāo)簽用于設(shè)置這個(gè)狀態(tài)下的所有界面元素的屬性(組件的屬性),因?yàn)槊總€(gè)界面狀態(tài)中各個(gè)組件的大小布局都不同,所以在狀態(tài)標(biāo)簽里就要預(yù)先設(shè)置好該狀態(tài)下的組件的位置與大小,那個(gè)target="{windowC}"屬性就是設(shè)置你要設(shè)置的哪個(gè)組件的名字拉,name="height"就是你要設(shè)置的屬性value="333"就是你要設(shè)置該屬性的值,我們細(xì)心看看的話,可能會(huì)發(fā)現(xiàn),每個(gè)狀態(tài)里面設(shè)置的屬性,都是width,height,x,y這四個(gè)屬性,我們看看上面的最終效果就知道無(wú)論切換哪個(gè)狀態(tài),組件間的變換來(lái)來(lái)去去都是移動(dòng)位置與大小改變,就是說(shuō)當(dāng)你變換狀態(tài)時(shí),需要改動(dòng)哪些屬性的,就將它的目標(biāo)值設(shè)置在<mx:SetProperty>標(biāo)簽里。再看看下面的<mx:transitions>標(biāo)簽,這個(gè)也是個(gè)集合,里面放著不同的變換方法<mx:Transition>,我們來(lái)看看變換標(biāo)簽的代碼:
          1 <mx:Transition fromState="*" toState="*">
          2 <mx:Parallel targets="{[windowA, windowB, windowC, windowD]}">
          3 <mx:Move />
          4 <mx:Resize />
          5 </mx:Parallel>
          6 </mx:Transition>

          formState與toState屬性是要設(shè)置該狀態(tài)變換是怎樣觸發(fā)的,里面要填上狀態(tài)的名字,<mx:State name="C">   C就是狀態(tài)的名字,即是如果你formState="A",toState="C"的話,只有從A狀態(tài)切換到C狀態(tài)時(shí),才會(huì)產(chǎn)生以上的變換動(dòng)畫效果,如果不附合該規(guī)則如A切換到B狀態(tài)的話,則只會(huì)按狀態(tài)的屬性設(shè)置值來(lái)直接生成視圖,而沒有動(dòng)畫漸變效果了。如果填上“*”的話,就是無(wú)論是哪個(gè)狀態(tài)切換到哪個(gè),都會(huì)運(yùn)行動(dòng)畫效果,至于變換期間用到哪種動(dòng)畫效果來(lái)進(jìn)行漸變,就在它的下級(jí)標(biāo)簽里定義了,這里它用到了<mx:Parallel>并列播放移動(dòng)與重整大小的動(dòng)畫效果,之前文章講過,這里不多說(shuō)了。基本上,一個(gè)變換就做好了,但我們還需要觸發(fā)它,也就是去改變程序當(dāng)前的顯示狀態(tài):click="currentState='A'" 在每個(gè)組件的click事件里,改變程序的currentState值,就是改變程序的當(dāng)前顯示狀態(tài)!之后動(dòng)畫效果就會(huì)觸發(fā)了!

          遲點(diǎn)有時(shí)間,再做一個(gè)3D的動(dòng)畫效果,將會(huì)用到PV3D的框架,再整理一個(gè)代碼與教程也貼出來(lái)跟大家分享吧,不過不知道大家對(duì)PV3D這個(gè)東東熟悉不,不熟悉的話,可能看得痛苦點(diǎn),至于PV3D方面的教程,我也看看抽點(diǎn)時(shí)間寫寫吧!先謝過大家的支持!
          posted on 2008-07-29 14:28 姜大叔 閱讀(6902) 評(píng)論(6)  編輯  收藏 所屬分類: Flash/Flex

          評(píng)論:
          # re: Flex的動(dòng)畫效果與變換!(三)(完) 2008-08-21 11:28 | glemon
          一定要這樣寫一大串嗎?不能通過判斷狀態(tài)和運(yùn)算的方式來(lái)計(jì)算目標(biāo)位置嗎?MXML不會(huì)這么不靈活嗎?  回復(fù)  更多評(píng)論
            
          # re: Flex的動(dòng)畫效果與變換!(三)(完)[未登錄] 2008-11-18 14:56 | zhou
          應(yīng)該是可以簡(jiǎn)化的,提供一個(gè)函數(shù)。在state 的activate事件里調(diào)用。這樣簡(jiǎn)潔通用一些。樓主只是舉例而已。  回復(fù)  更多評(píng)論
            
          # re: Flex的動(dòng)畫效果與變換!(三)(完) 2009-09-27 17:27 | 加油仔
          看你的flex文章收獲不少,更提高了對(duì)flex的好奇與喜愛。謝謝你。還希望你加油啊,我會(huì)常來(lái)的。  回復(fù)  更多評(píng)論
            
          # re: Flex的動(dòng)畫效果與變換!(三)(完) 2009-11-04 11:52 | 靜候良機(jī)
          不錯(cuò)的例子,既學(xué)習(xí)了State,又學(xué)習(xí)Transition;但是在效果方面應(yīng)用的稍微少了一些;
          我感覺樓主的意思,是過程,而不是結(jié)果,如果為了結(jié)果,可以時(shí)代碼更簡(jiǎn)潔一下;
          收藏樓主的博客,多多向你學(xué)習(xí)  回復(fù)  更多評(píng)論
            
          # re: Flex的動(dòng)畫效果與變換!(三)(完) 2010-07-28 16:50 | 阿斯頓
          不多,學(xué)到了不少的東西  回復(fù)  更多評(píng)論
            
          # re: Flex的動(dòng)畫效果與變換!(三)(完) 2011-10-07 17:00 | flex初學(xué)者
          請(qǐng)問還有別的簡(jiǎn)短的算法嗎?可以不要將那些寫得那么死嗎?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 青岛市| 旺苍县| 榆树市| 沾化县| 丹东市| 枝江市| 玛沁县| 开江县| 嘉黎县| 安塞县| 本溪| 班玛县| 迭部县| 忻城县| 德安县| 大丰市| 仪征市| 台南县| 祁东县| 伊春市| 延边| 桐城市| 名山县| 杭锦旗| 南通市| 永德县| 博乐市| 托克托县| 安岳县| 金昌市| 安新县| 商都县| 锡林郭勒盟| 洪湖市| 会同县| 淮北市| 三河市| 亚东县| 马山县| 松江区| 凌源市|