當前位置:開發者網絡 >> 技術教程 >> 網頁設計 >> Flash >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
Flash MX 2004新特性實例學習二
作者:未知
日期:2005-04-30
人氣:
投稿:(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:

    實例三、Customizing Context Menu

  一、涉及特性

  這個實例反映了Flash MX 2004在編程方面的重大改進。其中包括了as文件的應用,系統的_global.$clipboard變量的使用,ContextMenu(menufun) 函數的調用,ContextMenuItem()函數的調用,已經MovieClip.prototype.menu變量的使用。通過這幾個函數和變量的操作,就可以輕鬆地操作Flash Player中的菜單了。

  二、製作過程

  1、新建一個Action Script File,命名為「ClipBoard.as」,內容如下:   

  /* Copyright 2003 Macromedia, Inc. All rights reserved.

  The following is Sample Code and is subject to all restrictions

  on such code as contained in the End User License Agreement

  accompanying this product.

  */   

  class ClipBoard extends Object{ //註釋1   

  static var $contents:Object; //註釋2

  static var $operation:String; //註釋3   

  function ClipBoard() {} //註釋4   

  static public function cut(obj) { //註釋5

  obj._alpha = 50; //註釋6

  $contents = obj; //註釋7

  $operation = "cut"; //註釋8

  }   

  static public function copy(obj) { //註釋9

  $contents = obj;

  $operation = "copy";

  }   

  static public function paste() { //註釋10

  if ($operation == "cut") { //註釋11

  $contents._x = _root._xmouse; //註釋12

  $contents._y = _root._ymouse;

  $contents._alpha = 100; //註釋13

  $contents = undefined; //註釋14

  $operation = ""; //註釋15   

  } else if ($operation == "copy") { //註釋16

  var newdepth = $contents._parent.getNextHighestDepth(); //註釋17

  var newname = $contents._name + newdepth; //註釋18

  $contents.duplicateMovieClip(newname, newdepth); //註釋19

  $contents._parent[newname]._x = _root._xmouse; //註釋20

  $contents._parent[newname]._y = _root._ymouse;   

  $contents._alpha = 100;

  $contents._parent[newname]._alpha = 100;   

  } else {

  return; //註釋21

  }

  }   

  public function isEmpty():Boolean { //註釋22

  if ($contents != undefined) { //註釋23

  return false;

  } else {

  return true;

  }

  }  

  public function handleMenuCommand(obj, item):Void { //註釋24

  switch (item.caption) { //註釋25

  case "Cut object": //註釋26

  cut(obj);

  break;   

  case "Copy object": //註釋27

  copy(obj);

  break;   

  case "Paste object": //註釋28

  paste();

  break;

  }

  }

  }

 本實例有比較多的編程知識,剛接觸會有無從下手的感覺,下面來詳細講解一下涉及的東西。

  註釋1:class的意思是定義一個類,extends是表示所定義的類的基類是Object。這個涉及到編程的面向對象,可能比較難懂,可以把Object看成是所定義的類的父類,父類具有的方法和屬性,在子類中都是有的。

  註釋2:定義一個變量contents,類型為Object。Flash MX 2004中都是這樣定義變量的。在此處定義的變量,在整個類中都是可以用的。

  註釋3:定義一個變量operation,類型為String。

  註釋4:這是類的構造函數,所謂的構造函數就是當實例化這個類的時候所調用的函數。比如本類的實例化可以是這樣的:ClipBoard cb = new ClipBoard();

  註釋5:定義一個cut函數,傳入的參數是obj,它的調用範圍是public,也即是任何類都可以調用。

  註釋6:設置傳入的obj的alpha屬性為50。

  註釋7:設置註釋2中所定義的變量的值為obj。

  註釋8:設置註釋3所定義的變量的值為「cut」。

  註釋9:定義一個copy函數,傳入的參數是obj,調用範圍是public。

  註釋10:定義一個paste函數,沒有傳入的參數,調用範圍是public。

  註釋11:判斷所定義的operation的值是否為「cut」。

  註釋12:設置contents的xy坐標為鼠標的xy坐標。    

    註釋13:設置contents的alpha為100。

  註釋14:利用完contents的值後,將contents的值重新設置為undefined。

  註釋15:將operation的值清空。

  註釋16:判斷所定義的operation的值是否為「copy」。

  註釋17:定義一個變量newdepth,設置它的值為類中所定義的contents的深度。

  註釋18:定義一個變量newname,設置它的值為contents的實例名加上所在的深度。

  註釋19:複製一個Movie Clip,參數是newdepth和newname。這就實現了複製的功能。

  註釋20:設置所複製的Movie Clip的位置跟aplha。

  註釋21:如果operation不是「cut」也不是「copy」的話,直接返回。

  註釋22:定義一個函數isEmpty(),返回的類型為Boolean,調用的範圍為public。

  註釋23:根據contents的值做相應的操作。

  註釋24:定義一個函數handleMenuCommand,返回為空,調用範圍是public。

  註釋25:根據參數item的caption來做相應的操作,switch的功能跟多個if判斷差不多,但switch適用在判斷的條件可能很多的情況下。

  註釋26:如果caption的值是「Cut object」,調用cut (obj)函數。

  註釋27:如果caption的值是「Copy object」,調用copy (obj)函數。

  註釋28:如果caption的值是「Paste object」,調用paste(obj)函數。

 2、新建一個fla文件,保存在跟第一步所創建的ClipBoard.as在同一個目錄下面。

  3、按「Ctrl + F8」創建一個新的Movie Clip,命名為「square」,在此Movie Clip中用矩形工具繪製一個矩形。

  4、將第三步中創建的Movie Clip「square」拖到場景中,在它的Action面板上添加如下的Action Script:   

  on (release) { //註釋1

  stopDrag();

  }

  on (press) { //註釋2

  startDrag(this);

  mx.behaviors.DepthControl.bringToFront(this);

  }

  註釋1:當鬆開鼠標的時候,停止拖動對象。

  註釋2:當按下鼠標的時候,開始拖動對象,並將對像設置在最前面一層。

  5、在主場景的Time Line中增加一個Layer,命名為「Action」,在此層的Action面板上添加如下的Action Scipt:   

  /* Copyright 2003 Macromedia, Inc. All rights reserved.

  The following is Sample Code and is subject to all restrictions

  on such code as contained in the End User License Agreement

  accompanying this product.

  */   

  _global.$clipboard = new ClipBoard(); //註釋1   

  function menuCallback (obj, menuObj) { //註釋2

  var empty:Boolean = _global.$clipboard.isEmpty(); //註釋3

  menuObj.customItems = []; //註釋4

  if ((obj instanceof MovieClip) && (obj != _level0)) { //註釋5

  menuObj.customItems.push(cutItem); //註釋6

  menuObj.customItems.push(copyItem);

    if (!empty) { //註釋7

  menuObj.customItems.push(pasteItem);

  }   

  } else if (obj == _level0 && !empty) { //註釋8

  menuObj.customItems.push(pasteItem);

  }

  }   

  var myMenu = new ContextMenu(menuCallback); //註釋9

  //註釋10

  var cutItem = new ContextMenuItem("Cut object", _global.$clipboard.handleMenuCommand);

  //註釋11

  var copyItem = new ContextMenuItem("Copy object", _global.$clipboard.handleMenuCommand);

  //註釋12

  var pasteItem = new ContextMenuItem("Paste object", _global.$clipboard.handleMenuCommand);

  //註釋13

  MovieClip.prototype.menu = myMenu;

  註釋1:這裡就是剛剛所定義的ClipBoard ()的實例化,不過_global.$clipboard是系統已經有的了,所以可以直接用。

  註釋2:定義一個函數menuCallback,在創建菜單的時候用。

  註釋3:定義一個Boolean 類型的變量empty,它的值是調用函數_global.$clipboard.isEmpty()後所返回的值。

  註釋4:將menuObj的customItems設置為空數組。

  註釋5:判斷obj所具有的屬性。

  註釋6:將「cut」和「copy」添加到菜單中。

  註釋7:如果empty為假的話(也就是已經有cut或copy操作),將paste添加到菜單中。

  註釋8:如果鼠標沒有選定對象的話,只將paste添加到菜單中。

  註釋9:實例化一個對像myMenu,其中構造函數調用了menuCallback函數。

  註釋10:實例化一個對像cutItem,這是一個子菜單,顯示的內容為「Cut object」。

  註釋11:實例化一個對像copyItem,這是一個子菜單,顯示的內容為「Copy object」。

  註釋12:實例化一個對像pasteItem,這是一個子菜單,顯示的內容為「Paste object」。

    註釋13:將所定義的myMenu賦給系統。

  三、實際用途

  這個實例不單單為操作Flash Player的菜單提供了一種方法,也展示了怎麼利用as文件來編程。瞭解清楚細節,對掌握Flash MX 2004的編程很有用。


相關文章: