隨筆-31  評(píng)論-257  文章-0  trackbacks-0
                好久沒有發(fā)表文章了,這天寫了一個(gè)Flash的一個(gè)動(dòng)畫菜單的效果,在之前看到一個(gè)站的一個(gè)菜單效果挺不錯(cuò),就試著自已也用純AS3寫一個(gè)出來試試。看了一下研究了一個(gè)算法,自已也寫了個(gè)出來,寫得比較粗糙,所以運(yùn)行時(shí)可能還會(huì)有點(diǎn)小問題,有空要再優(yōu)化一下算法才行。


          有點(diǎn)像 Apple 的菜單效果。原本是計(jì)劃用圖片的,不過后右為簡單起見,就只用Sprite畫的一個(gè)小方格代替了,供大家學(xué)習(xí)學(xué)習(xí),也希望高手指點(diǎn)一下算法!
          以下是代碼:
            1 package {
            2     import flash.display.Sprite;
            3     import flash.geom.Point;
            4     import flash.events.MouseEvent;
            5     import flash.events.Event;
            6     import fl.transitions.Tween;
            7     import fl.transitions.easing.*;
            8 
            9     public class jiangmenu extends Sprite
           10     {
           11         private var photoList:Array;            //存放所有方格的數(shù)組
           12         private var defaultLocation:Array;        //存放對(duì)應(yīng)方格數(shù)組的默認(rèn)位置信息
           13         private var targetLocation:Array;        //存放對(duì)應(yīng)方格數(shù)組的改變的目標(biāo)位置信息
           14         private var defaultScale:Array;            //存放對(duì)應(yīng)方格數(shù)組的默認(rèn)縮放比例信息
           15         private var targetScale:Array;            //存放對(duì)應(yīng)方格數(shù)組的目標(biāo)縮放比例信息
           16        
           17         private var maxScale:Number = 1.8;        //最大的縮放比例(即鼠標(biāo)指向的那個(gè)方格)
           18         private var scaleRate:Number = 0.65;    //縮放比例向兩邊衰減的值
           19         private var sideWidth:Number = 30;        //方格的邊長
           20        
           21         private var tween:Tween;
           22        
           23         /**
           24          * 構(gòu)造函數(shù)
           25          */
           26         public function jiangmenu()
           27         {
           28             photoList = createPhotoList();
           29             createDefaultLocation();
           30             createDefaultScale();
           31             addListener();
           32         }
           33        
           34         /**
           35          * 該函數(shù)作于對(duì)每個(gè)按鈕(小方格)增加偵聽器
           36          */
           37         private function addListener():void{
           38             for(var i:int=0;i<photoList.length;i++){
           39                 var p:Point = defaultLocation[i] as Point;
           40                 var sp:Sprite = photoList[i] as Sprite;
           41                 sp.x = p.x;
           42                 sp.y = p.y;
           43                 addChild(sp);
           44                 sp.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
           45                 sp.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
           46             }
           47            
           48         }
           49        
           50         /**
           51          * 鼠標(biāo)離開小方格時(shí)
           52          */
           53         private function onMouseOut(e:MouseEvent):void{
           54             playDefault();
           55         }
           56        
           57         /**
           58          * 鼠標(biāo)移動(dòng)到小方格時(shí)
           59          */
           60         private function onMouseOver(e:MouseEvent):void{
           61             var sp:Sprite = e.target as Sprite;
           62             var index:int = photoList.indexOf(sp);
           63             var dp:Point = defaultLocation[index] as Point;
           64             Point(targetLocation[index]).x = dp.x;
           65             Point(targetLocation[index]).y = dp.y;
           66             targetScale[index] = 1*maxScale;
           67            
           68             playSingle(index);
           69            
           70             setFrontPhoto(index);
           71             setBackPhoto(index);
           72            
           73         }
           74        
           75         /**
           76          * 為單個(gè)方格進(jìn)行播放動(dòng)畫效果
           77          */
           78         private var tmpSP:Sprite;
           79         private function playSingle(index:Number):void{
           80             tmpSP = photoList[index] as Sprite;
           81            
           82             new Tween(tmpSP,"scaleX",Elastic.easeOut,tmpSP.scaleX,targetScale[index],1,true);
           83             new Tween(tmpSP,"scaleY",Elastic.easeOut,tmpSP.scaleY,targetScale[index],1,true);
           84             new Tween(tmpSP,"y",Elastic.easeOut,tmpSP.y,Point(targetLocation[index]).y,1,true);
           85         }
           86        
           87         /**
           88          * 當(dāng)鼠標(biāo)離開小方格時(shí),將播放還原到默認(rèn)大小時(shí)的動(dòng)畫
           89          */
           90         private function playDefault():void{
           91             for(var i:int=0;i<photoList.length;i++){
           92                 tmpSP = photoList[i] as Sprite;
           93                 new Tween(tmpSP,"scaleX",Elastic.easeOut,tmpSP.scaleX,defaultScale[i],1,true);
           94                 new Tween(tmpSP,"scaleY",Elastic.easeOut,tmpSP.scaleY,defaultScale[i],1,true);
           95                 new Tween(tmpSP,"y",Elastic.easeOut,tmpSP.y,Point(defaultLocation[i]).y,1,true);
           96             }
           97         }
           98        
           99         /**
          100          * 以鼠標(biāo)移動(dòng)到當(dāng)前方格的索引為參數(shù),設(shè)置該方格前面的方格的位置與縮放信息并播放
          101          * 設(shè)置完成后再設(shè)置前面的(使用遞歸)
          102          */
          103         private function setFrontPhoto(index:int):void{
          104             if(index == 0){
          105                 return;
          106             }
          107             var bp:Point = targetLocation[index] as Point;
          108             var bs:Number = targetScale[index];
          109            
          110             var ms:Number = bs * scaleRate;
          111             var mp:Point = new Point(bp.x,bp.y - sideWidth*bs*.5 - sideWidth*ms*.5);
          112            
          113             targetLocation[index - 1= mp;
          114             targetScale[index - 1= ms;
          115            
          116             playSingle(index - 1);
          117            
          118             setFrontPhoto(index - 1);
          119         }
          120        
          121         /**
          122          * 以鼠標(biāo)移動(dòng)到當(dāng)前方格的索引為參數(shù),設(shè)置該方格后面的方格的位置與縮放信息并播放
          123          * 設(shè)置完成后再設(shè)置后面的(使用遞歸)
          124          */
          125         private function setBackPhoto(index:int):void{
          126             if(index == (targetLocation.length - 1)){
          127                 return;
          128             }
          129             var bp:Point = targetLocation[index] as Point;
          130             var bs:Number = targetScale[index];
          131            
          132             var ms:Number = bs * scaleRate;
          133             var mp:Point = new Point(bp.x,bp.y + sideWidth*bs*.5 + sideWidth*ms*.5);
          134            
          135             targetLocation[index + 1= mp;
          136             targetScale[index + 1= ms;
          137            
          138             playSingle(index + 1);
          139            
          140             setBackPhoto(index + 1);
          141         }
          142        
          143         /**
          144          * 創(chuàng)建默認(rèn)的原始大小時(shí)的縮放比例
          145          */
          146         private function createDefaultScale():void{
          147             defaultScale = new Array();
          148             targetScale = new Array();
          149             for(var i:int=0;i<10;i++){
          150                 defaultScale[i] = 1;
          151                 targetScale[i] = 1;
          152             }
          153         }
          154        
          155         /**
          156          * 創(chuàng)建默認(rèn)的原始大小時(shí)位置(X,Y)信息
          157          */
          158         private function createDefaultLocation():void{
          159             defaultLocation = new Array();
          160             targetLocation = new Array();
          161             for(var i:int=0;i<10;i++){
          162                 var point:Point = new Point();
          163                 point.x = 100;
          164                 point.y = 30 * i + 50;
          165                 defaultLocation.push(point);
          166                 targetLocation.push(point);
          167             }
          168         }
          169        
          170         /**
          171          * 創(chuàng)建10個(gè)小方格,這里直接產(chǎn)生了,不用循環(huán)了
          172          */
          173         private function createPhotoList():Array{
          174             var arr:Array = new Array();
          175            
          176             var sp1:Sprite = new Sprite();
          177             var sp2:Sprite = new Sprite();
          178             var sp3:Sprite = new Sprite();
          179             var sp4:Sprite = new Sprite();
          180             var sp5:Sprite = new Sprite();
          181             var sp6:Sprite = new Sprite();
          182             var sp7:Sprite = new Sprite();
          183             var sp8:Sprite = new Sprite();
          184             var sp9:Sprite = new Sprite();
          185             var sp10:Sprite = new Sprite();
          186            
          187             sp1.graphics.beginFill(0xff0000);
          188             sp1.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          189             sp1.graphics.endFill();
          190            
          191             sp2.graphics.beginFill(0x00ff00);
          192             sp2.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          193             sp2.graphics.endFill();
          194            
          195             sp3.graphics.beginFill(0x0000ff);
          196             sp3.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          197             sp3.graphics.endFill();
          198            
          199             sp4.graphics.beginFill(0x00ffff);
          200             sp4.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          201             sp4.graphics.endFill();
          202            
          203             sp5.graphics.beginFill(0xffff00);
          204             sp5.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          205             sp5.graphics.endFill();
          206            
          207             sp6.graphics.beginFill(0x0f0f0f);
          208             sp6.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          209             sp6.graphics.endFill();
          210            
          211             sp7.graphics.beginFill(0xf0f0f0);
          212             sp7.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          213             sp7.graphics.endFill();
          214            
          215             sp8.graphics.beginFill(0xff00ff);
          216             sp8.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          217             sp8.graphics.endFill();
          218            
          219             sp9.graphics.beginFill(0x000000);
          220             sp9.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          221             sp9.graphics.endFill();
          222            
          223             sp10.graphics.beginFill(0xffffff);
          224             sp10.graphics.drawRect(-15,-15,sideWidth,sideWidth);
          225             sp10.graphics.endFill();
          226            
          227             arr = [sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10];
          228            
          229             return arr;
          230         }
          231     }
          232 }
          233 



          posted on 2008-07-29 14:33 姜大叔 閱讀(1390) 評(píng)論(0)  編輯  收藏 所屬分類: Flash/Flex
          主站蜘蛛池模板: 白水县| 溆浦县| 左权县| 濉溪县| 福州市| 鹤庆县| 冀州市| 疏附县| 东山县| 晋州市| 敦化市| 上林县| 得荣县| 堆龙德庆县| 庆安县| 九江县| 福建省| 会昌县| 景东| 姚安县| 中山市| 十堰市| 伊春市| 云龙县| 永康市| 富川| 东方市| 鸡西市| 长宁县| 通榆县| 武鸣县| 仁布县| 泰来县| 清丰县| 永德县| 三都| 静乐县| 蛟河市| 黄山市| 龙井市| 积石山|