其實到目前為止,我的3.0開發(fā)學(xué)習(xí)筆記已經(jīng)有3萬字左右的東西了,但都是些綱要和代碼,整理成文,尤其是用比較有條理和易懂的方式寫出來會比較慢。況且開發(fā)中的代碼是隨手拈來,但寫教程的代碼往往要經(jīng)過一些改寫,使得重點更突出。所以如果更新有點慢,請耐心一些,呵呵。
如何接收事件?如何做到AS3.0的標(biāo)準(zhǔn)事件編程?
Event改變的部分很多,這兩天有空時,黑羽就在想怎樣用一個有條理的方式來講解Event和它相關(guān)的諸多內(nèi)容,讓我們感到比較容易理解,記憶和接受。 我準(zhǔn)備這樣來講解:
先給個接受事件的代碼例子。在例子中,指出:
- Event對象發(fā)生了什么變化
- addEventListener語法的不同,原因,和const型必要性和用法
- Listener和As2.0有何不同,和this關(guān)鍵字的“改進了的記憶力”
黑羽一貫的風(fēng)格,先來一個例子。我很想給個短一點的代碼例子,但是要達(dá)到清楚,全面和標(biāo)準(zhǔn)的示范,我還是決定采用這個Document Class的示例。我會在每個代碼段注一些注釋,大家不明白的地方回貼說一下,我會盡量解答。
Document Class的含義和相關(guān)用法并不難,忘了的兄弟看我第3篇教程: AS3.0教程(3):Document Class特色為我們帶來了什么?
好,繼續(xù)....
新建一個as文件,拷貝以下代碼,命名為AddListener.as。
新建一個fla,命名為 "黑羽黑羽我愛你.fla"(本教程推薦使用,倘若不遵從可能導(dǎo)致喝涼水塞牙泡MM被踢炒股被套等嚴(yán)重后果,霍哈哈。Just kidding。)。設(shè)置它的文檔類(Document Class)為AddListener.
package { import flash.display.Sprite; import flash.events.MouseEvent; //哈哈,看到了沒,Document Class不僅可以擴展MovieClip,也可以擴展Sprite //package里面的類名要和文件名相同 public class AddListener extends Sprite { public function AddListener() {
//用package外面定義的類KingdaSprite創(chuàng)建一個實例,由于同文件中,所以不用import啦 var outsideChild:KingdaSprite = new KingdaSprite(0x00FF00, "outside_sprite"); addChild(outsideChild);//沒有了這一句,你啥都看不到。 outsideChild.addEventListener(MouseEvent.CLICK, inclassHandler);//注冊類里面的偵聽器 outsideChild.addEventListener(MouseEvent.CLICK, outsideHandler);//注冊類外面的偵聽器 }
private function inclassHandler(event:MouseEvent):void { trace("類里面的偵聽器偵聽到MouseEvent事件: " + event); trace("this關(guān)鍵字指向:"+this); } } }
function outsideHandler(event:MouseEvent):void { trace("類外面的偵聽器偵聽到MouseEvent事件: " + event); trace("this關(guān)鍵字指向:"+this); }
import flash.display.Sprite; import flash.events.MouseEvent;
//這個類就是畫一個矩形,然后你點擊這個矩形會發(fā)出標(biāo)準(zhǔn)鼠標(biāo)click的事件 class KingdaSprite extends Sprite { public var nickname:String; public var ColorNum:uint; //colorNumber就是#ffcc00這種類型的數(shù),在AS3中推薦用新的uint型來標(biāo)記它 public function KingdaSprite(colorNumber:uint, nameString:String) { ColorNum = colorNumber; nickname = nameString; graphics.beginFill(ColorNum); graphics.drawRect(0,0,100,100); graphics.endFill(); } }
鼠標(biāo)一點擊創(chuàng)建出來的綠色矩形,會看到輸出
類里面的偵聽器偵聽到MouseEvent事件: [MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this關(guān)鍵字指向:[object AddListener]
類外面的偵聽器偵聽到MouseEvent事件: [MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this關(guān)鍵字指向:[object global]
演示完畢,我們來講第一個話題
(一)Event對象發(fā)生了什么變化
AS2.0中創(chuàng)建event 對象是很隨意的,只要這個對象有一個String屬性叫做type的就可以了,甚至連target都可以省掉。不要以為這不規(guī)范不應(yīng)該做,看看Flash類源碼,Macromedia的程序員可不只一次的這樣使用過。所謂上梁不正下梁歪,就是這樣。(其實嚴(yán)格說也沒什么不對,有時候是不需要target。但沒有標(biāo)準(zhǔn)就是不好) 然后你在Event Object中愛添加什么就添加什么。極其自由,也就等于極其混亂。
3.0不同了,所有的事件必須都要繼承自Event這個類(全飾名稱flash.events.Event)。不然,哼哼,事件發(fā)送是不能成功地。
說說Event這個類,AS3.0的基石類是Object,Event是直接繼承自O(shè)bject的,開國大佬級別的。它里面定義了一些基本的事件名稱,比如ACTIVATE(FlashPlayer得到系統(tǒng)焦點時事件),ADDED(對象被添加到顯示時發(fā)送的事件)。AS3.0中有個好功能是cancel事件,但Event中這些基本事件統(tǒng)統(tǒng)是不能被cancel的,聽起來似乎很NB。這不細(xì)說了,Event太多內(nèi)容了。以后寫高級內(nèi)容時在提到如何運用吧。要想Flash玩的轉(zhuǎn),Event類必須很精通。正所謂江湖人稱:"平生不識Event,就稱閃客也枉然。"
這樣有什么好處?
- 規(guī)范了事件的定義
- 大量由此衍生的類省去了我們大量的時間和重復(fù)開發(fā)的成本。
規(guī)范事件的定義放到下一部分講。至于內(nèi)置的Event子類好處,大家請看上面fla的運行輸出,MouseEvent就是內(nèi)建的一個Event子類,它的好處一看它的內(nèi)容就明白,從AS3.0起,任何一次點擊事件我們都可以得到:
- 事件發(fā)生時鼠標(biāo)的MC相對坐標(biāo)(localX=64 localY=80)和絕對坐標(biāo)(stageX=64 stageY=80)。
- ctrl鍵,shift鍵,alt鍵有沒有按下。你試試按著ctrl鍵再點擊一下方塊,那么ctrlKey就為true了。(其余參數(shù)不解釋,涉及到高級運用。部分會在Event最后一節(jié)提到該怎么運用)
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁 強大的事件機制 [1] 下一頁 強大的事件機制 [3]
◎進入論壇Flash專欄版塊參加討論
|