• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            教父的告白
            一切都是紙老虎
            posts - 82,  comments - 7,  trackbacks - 0

            大家好,今天亦樂首次為大家帶來flash actionscript轉載教程。首先聲明出處(我自己是沒時間寫教程啦,要直接找我討論還好)

             版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
            http://goday.blogbus.com/logs/14062836.html

             

            今天,我也正式宣布,開始成為閃客,以往對macromedia flash的許多頭疼問題都被adobe解決了,以往一直否認我喜歡做flash,現在總算可以為adobe flash 自豪。非常有系統的developing方式。RIA 平臺, on screen project就不這里說了。

             

            這期帶來的是flash極重要元素之一,event事件。在游戲里就是所謂的Trigger. Adobe改良后的,大家謂稱的“冒泡機制”。有問題歡迎發問指教。

             

            =思路大綱=

            1. ActionScript 2的問題
            2. AS3解決問題
            3. 結合問題,說明“冒泡”
            4. 冒泡的問題所在以及解決方法


            1 - ActionScript 2的問題

            stage里有一個mc,mc里有一個btn
            點選mc實現拖動mc,鼠標松開停止拖動
            點選mc實現mc隱藏。
            最容易想到的方法,代碼如下:

            mc.onPress = function() {
                    this.startDrag();
            };
            mc.onRelease = function() {
                    this.stopDrag();
            };
            mc.btn.onPress = function() {
                    mc._visible=false
            };

            表面來看,這個思路是正確的。(實際上沒什么思路可言,很簡單的方法。)
            實際怎么樣?當然是不能實現。
            問題:點擊btn,不能觸發btn的動作!!!!
            解釋:  因為btn處于mc內部,mc被加上了事件以后,按照as2的事件機制,mc內部的btn甚至是其他的元件都不能接受事件。或者可以認為mc的事件覆蓋了mc中其他元件的事件。
            從非冒泡機制來說,在btn上點擊鼠標,首先接受到點擊事件的自然是btn的上一層(也就是mc),然后才是btn元件。Mc先接受到點擊事件,觸發相關的函數。然后呢?我們要實現的點擊btn的效果沒了。我們可以認為mc把我們的鼠標點擊事件據為私有了,不再往下傳遞。(如果是冒泡機制的話,這個動作就回繼續往下傳遞到btn,然后btn會執行。)那么這種效果在as2中還能實現么?答案自然是肯定的,不過方法就復雜了。
            這里就不討論了。As3已經成為主流。
            但是as3中的冒泡機制,讓我們可以簡單的解決這樣的難題。

            2 - AS3解決問題

            下面來看as3中怎么實現。
            代碼如下:

            import flash.events.*;
            mc.addEventListener(MouseEvent.CLICK,mcfunction);
            mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);

            function mcfunction(event:MouseEvent) {
                    trace("mc click");
            }
            function btnfucntion(event:MouseEvent) {
                    trace("btn click");
            }

             

            看看代碼就覺得,好像沒用什么特別的解決方法,就加兩個偵聽函數,就搞定了。
            這個代碼自然的不能再自然了,就好像做flash 先的安裝軟件一樣。
            但是如此自然的代碼下面,使AS3的冒泡機制在提供支持。 

            3 - 結合問題,說明冒泡機制:
            Help中有一個冒泡機制的圖,相信大家都已經看過了
            這里我聯系實例,另外做一個圖,幫助各位理解。

            2D2D13C9009ACC1FF3AADD80E5C4FB85 

            上圖為as2中的執行原理
            下圖為as3中的執行原理
             2D8D966808DAEEA2C9701B5E09B334FE 
            上圖也就是在as3中實現我們文章開始提出的例子的工作原理。
            下面詳細描述一下

            捕獲階段:
            鼠標在btn上發出點擊事件,首先捕捉到該事件的事stage.,然后事件往下傳遞到mc,再到btn..(如果鼠標事件發生在btn按鈕中的一個label上,那么該事件還會繼續向下傳遞,直到找到label元件。)AS2中,一旦找到了可以相應事件的函數,就停止了,不會往下傳遞。這個道理應該說明白了
            目標階段
            找到我們的鼠標最底層的目標,也就是btn以后,那么就開始執行btn的偵聽函數了。
                如果鼠標事件發生的所在位置,是mc中的btn中的一個label。那么將先執行label的偵聽函數。(當然我們的例子中沒有label)
            冒泡階段:
            執行了目標階段的偵聽函數以后,開始冒泡。
            換一個說法是,返回btn的父級元件mc,如果能找到相關的偵聽函數,那么就執行,如果沒有,就繼續往上冒泡到btn的父級元件mc的父級元件stage。看能不能找到相關的偵聽函數。

            注意一個:首先執行的函數一定是目標對象的偵聽函數。就像我們上面的例子一樣,點擊btn會先trace(“btn click”),然后冒泡到mc,執行trace(“mc click”)..然后繼續往上,如果stage我們也加一個偵聽函數,執行語句,那么還會繼續執行 trace(“stage click”).
            到達stage頂層了,冒泡結束。
            說到這里,各位看官也應該明白了as3的冒泡究竟是干什么用的了

            4 - 冒泡的問題所在以及解決方法
              冒泡也有問題,并不是說它有缺陷,因為出現問題無法避免。
              問題在于,
              假如在上面的例子中,我們不想在點擊btn冒泡階段中執行mc的偵聽函數,我們只想執行btn的偵聽函數。怎么解決?
            同樣的問題延伸出去,可以得到很多擴展和應用。
            那么我們需要阻止他的冒泡的時候執行相關的偵聽函數。
            Chm中的方法有

            stopImmediatePropagation():void
            防止對事件流中當前節點中和所有后續節點中的事件偵聽器進行處理。
            stopPropagation():void
            防止對事件流中當前節點的后續節點中的所有事件偵聽器進行處理。

            用來修改我們上面的例子
            代碼如下:

            import flash.events.*;
            mc.addEventListener(MouseEvent.CLICK,mcfunction);
            mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
            function mcfunction(event:MouseEvent) {
                    trace("mc click");
            }
            function btnfucntion(event:MouseEvent) {
                    trace("btn click");
                    event.stopPropagation();//修改在此處。簡單一句,解決問題
            }

            現在可以試試,點擊btn運行得到的結果就是

            代碼:
            btn click

            說明,已經防止了冒泡階段中對mc偵聽函數的處理。也就沒有trace(“mc click”)了
            As3事件機制遠遠不像這里寫的那么簡單,還有很多東西需要研究。
            本文只為拋磚引玉,讓各位能先了解一下冒泡機制。
            希望能多的朋友能提供相關的學習資料

            posted on 2010-03-15 15:03 暗夜教父 閱讀(450) 評論(0)  編輯 收藏 引用 所屬分類: AS3

            <2010年3月>
            28123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产成人| 久久综合久久鬼色| 久久午夜伦鲁片免费无码| 一级做a爱片久久毛片| 久久丫忘忧草产品| 色综合久久久久| 久久99久久99精品免视看动漫| 久久99毛片免费观看不卡| 亚洲AV日韩AV永久无码久久| 欧美亚洲日本久久精品| 久久精品成人欧美大片| 欧美亚洲国产精品久久蜜芽| 人人狠狠综合久久亚洲| 色综合久久中文字幕无码 | 久久高清一级毛片| 日日躁夜夜躁狠狠久久AV| 精品久久久无码中文字幕| 无码AV波多野结衣久久| 一级做a爰片久久毛片看看| 久久有码中文字幕| 久久精品人人做人人爽电影蜜月 | 久久久久AV综合网成人| 日韩一区二区三区视频久久| 99久久精品国产高清一区二区| 久久久久亚洲AV无码永不| 亚洲精品国产第一综合99久久 | 久久99国产精品99久久| 青草国产精品久久久久久| 色天使久久综合网天天| 国产福利电影一区二区三区,免费久久久久久久精 | 精品久久久久久亚洲精品 | 久久久久久久综合日本| 青青青青久久精品国产h| 国产成年无码久久久久毛片| 亚洲午夜久久久影院伊人| 久久精品aⅴ无码中文字字幕重口| 伊人久久国产免费观看视频 | 亚洲国产精品久久久久| 久久精品无码一区二区三区| 99久久无色码中文字幕| 999久久久无码国产精品|