Flash MX 2004 ActionScript圖文教程(九) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- Flash MX 2004 ActionScript圖文教程(九) (http://www.webasp.net/article/22/21327.htm) |
| -- 作者:未知 -- 發佈日期: 2005-04-30 |
| 2.2實例 前面簡要介紹了一下幾種常用的鼠標事件,下面我們就通過一個完整的例子來綜合運用一下這些事件。 首先建立一個場景,向其中添加三個影片剪輯實例,名稱命名為hand_mc、message_txt、eventTrapper_btn和dragTest_mc,hand_mc用來替換鼠標、message_txt是一個動態文本,顯示反饋信息,eventTrapper_btn是按鈕實例,用來捕捉各種鼠標事件,dragTest_mc則用來演示拖動事件的處理。 2.2.1自定義鼠標 我們經常需要在Flash程序中使用自定義的鼠標指針,下面在這個例子中,我們將把鼠標指針換成自定義的外形。進入主場景,選擇第一幀,在腳本面板中輸入以下的代碼: stop (); Mouse.hide(); startDrag ("hand_mc", true); Message_txt.text = "開始鼠標事件試驗 "; 第一句代碼是stop(),也就是讓影片播放到這裡停下來一邊等待用戶的操作,Mouse.hide()隱藏鼠標指針,緊接著startDrag則是開始對影片剪輯實例hand_mc的拖動操作,由於前面已經將鼠標指針隱藏,因此這個命令現在的作用相當於將鼠標指針替換為一個圖標。注意看,startDrag後面有兩個參數,第一個作用很明顯,就是將影片剪輯實例hand_mc作為拖動對象,而後面的ture則是將影片剪輯實例的中心和鼠標指針的中心鎖定起來,如果設置為false,那麼影片剪輯的中心將會和鼠標在場景內首次單擊的點的位置鎖定起來。在這個例子中,我們使用startDrag命令的目的是模擬鼠標指針替換的效果,因此顯然應當設置這個參數為true。 2.2.2捕捉並處理事件 現在選中影片剪輯實例eventTrapper_btn,進入腳本面板,在這裡我們可以編寫一系列的事件處理代碼。前面我們介紹了多個和鼠標相關的事件,這裡就將其一個個捕獲,注意觀察他們之間的異同。 on (rollOver) { message_txt.text = "鼠標浮動事件"; } on (rollOut) { message_txt.text = "鼠標移出事件"; } on (press) { message_txt.text = "鼠標單擊事件"; } on (dragOut) { message_txt.text = "鼠標在當前對像上按下左鍵後拖出"; } on (release) { message_txt.text = "鼠標釋放事件"; } 以上幾個是比較簡單的事件,下面我們再來處理稍微複雜一些的事件。 選擇影片剪輯實例dragTest_mc,然後再代碼面板中輸入這樣的代碼 on (dragOver) { this._alpha = this._alpha - 10; } 當用戶按下鼠標左鍵並在dragTest_mc上拖動時,這個事件內部的代碼就會被執行。this變量前面我們已經打過交道了,它的作用就是引用當前的對象(也就是dragTest_mc),_alpha是它的一個屬性,透明度,這裡我們通過一個簡單的運算逐次降低其透明度,最終的效果類似於圖像被橡皮擦掉一樣。 再選擇按鈕eventTrapper_btn,為其添加這樣的代碼: on (releaseOutside) { eventTrapper_btn._x = _root._xmouse; eventTrapper_btn._y = _root._ymouse; } 這段代碼可以實現拖放效果,當用戶在eventTrapper_btn上按下鼠標左鍵並拖動,當鼠標在eventTrapper_btn外面釋放時,releaseOutside事件就會發生,在這個事件中我們將eventTrapper_btn的位置(通過_x和_y坐標來定義)設置為當前鼠標釋放時鼠標所處的坐標位置,按鈕就會移動了。 上面是通過鼠標拖動的方式移動物體,下面再試試看用鍵盤來實現,選擇evnetTrapper_btn,為其追加這樣的代碼。 on (keypress" eventTrapper_btn._x = eventTrapper_btn._x-6 } on (keypress" eventTrapper_btn._x = eventTrapper_btn._x+6 } on (keypress" eventTrapper_btn._y = eventTrapper_btn._y-6 } on (keypress" eventTrapper_btn._y = eventTrapper_btn._y+6 } 這四個事件的作用是很明顯的,當用戶按向左鍵時(發生keypress」 2.2.3影片剪輯和按鈕 從前面的實例可以看出,影片剪輯的實例也是可以擁有自身的事件處理代碼的。但是在使用影片剪輯實例事件時必須注意以下幾個問題: 我們可以為影片剪輯實例添加原本由按鈕捕捉的事件,比如rollOver、rollOut等等。不過要特別注意,影片剪輯實例雖然可以捕捉這樣的事件,但是在這些事件的處理中我們不能直接引用其他的對象,一般我們只對影片剪輯自身的屬性進行修改,比如前面影片剪輯實例dragTest_mc處理事件就是一個例子。我們可以在這個事件的處理中修改影片剪輯實例dragTest_mc的透明度,但是不要指望在其中簡單地加上message_txt.text=「」這樣的代碼就能修改反饋區的內容。在執行過程中,這樣的代碼是不會有效果的,而且Flash不會報錯,這經常會讓初學者感到暈頭轉向。解決的方法有兩個,一是用按鈕代替影片剪輯,其次是對上面的代碼進行一下小修改,改成:_root.message_txt.text=」」,這樣程序又能夠執行。_root是Flash提供的一個內置對象,通過它可以準確地定位界面上的元素。 當某個影片剪輯實例被賦予了鼠標事件之後,鼠標指針在其上方會顯示為一個小手,為了避免這種情況出現,可以讓它捕捉rollOver事件,並加入這樣的代碼。 on (rollOver) { this.useHandCursor = false; } useHandCursor這個屬性就是設置當鼠標在當前對像上懸浮時是否顯示手形指針,默認值為true,也就是顯示手形指針,這裡將其設置為false就不會顯示了。 我們可以為按鈕實例指定名稱(後綴一般用_btn),不過不要有錯覺,按鈕實例和影片實例還是很多區別的。最重要的點就是,按鈕沒有自己的時間線,而影片剪輯則有自己的時間線。這是什麼意思呢?簡單地說,這點區別在this的使用上面體現出來。比方說,如果我們為一個影片剪輯實例添加了這樣的事件處理代碼: on (press) { this._rotation = 30; } 當你在這個影片剪輯實例上單擊鼠標左鍵時,影片剪輯實例將會發生旋轉。但是如果你將這樣的代碼賦予一個按鈕實例,那麼當你單擊這個按鈕時,將不會是按鈕自身旋轉而是按鈕的父對像旋轉。很多情況下,這種奇怪的現象會讓分不清按鈕實例和影片剪輯實例之間微小區別的用戶答感困惑。 再來看一個前面舉過的一個例子 on (releaseOutside) { eventTrapper_btn._x = _root._xmouse; eventTrapper_btn._y = _root._ymouse; } 這行代碼中,你也許會覺得eventTrapper_btn._x這樣的語句太繁瑣,用this._x多方便直接呢?如果這段時間處理代碼是賦予影片剪輯實例的話,這樣做就沒有問題,但是在前面的那個例子中,這段代碼是提供給按鈕實例使用的,所以必須清楚明白地講清楚移動的對象,否則運行的效果會和我們預先的設想大相逕庭。 如果你需要使用一個影片剪輯代替按鈕的話,可以考慮在其內部添加特殊的標籤(_up、_over、_down),然後編寫相應的代碼。另外,每個按鈕都會有一個「熱區」,也就是單擊有效的區域,通常就是按鈕的圖形覆蓋的範圍,如果你需要修改這個區域的範圍可以使用影片剪輯實例的hitArea屬性,例如 myClipButton_mc.hitArea = _root.myHitClip_mc; 總的來說,按鈕夠實現的功能,影片剪輯都能實現,而影片剪輯能夠實現的功能按鈕則未必能夠實現。那還要按鈕有什麼用?這主要是由於,按鈕是程序界面使用極其頻繁的元素,提供專門的按鈕類型可以提高設計的效率。 |
| webasp.net |