Bitmapdata 截圖

import flash.events.MouseEvent;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.display.MovieClip;
import flash.geom.Rectangle;

mask_mc.addEventListener(MouseEvent.MOUSE_DOWN,OnMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP,OnMouseUp);
function OnMouseDown(evt:MouseEvent)
{
    mask_mc.startDrag(false,new Rectangle(source_mc.x,source_mc.y,source_mc.width-mask_mc.width,source_mc.height-mask_mc.height));
}
function OnMouseUp(evt:MouseEvent)
{
    mask_mc.stopDrag();
    getThumbnail();
}

function getThumbnail()
{
    var nX:Number = source_mc.x - mask_mc.x;
    var nY:Number = source_mc.y - mask_mc.y;
    var pt:Point = new Point(mask_mc.x,mask_mc.y);
    pt = source_mc.globalToLocal(pt);
    var nW:Number = mask_mc.width;
    var nH:Number = mask_mc.height;
    var rect:Rectangle = new Rectangle(pt.x,pt.y,nW,nH);

    var bitmapdata:BitmapData = new BitmapData(nW,nH);
    var bitmapdataSource:BitmapData=new BitmapData(source_mc.width,source_mc.height);
    bitmapdataSource.draw(source_mc);
    
    bitmapdata.copyPixels(bitmapdataSource, rect, new Point(0, 0));

    if (getChildByName("bmp") != null)
    {
        removeChild(getChildByName("bmp"));
    }
    var bitmap:Bitmap = new Bitmap(bitmapdata);
    bitmap.name = "bmp";
    bitmap.x = source_mc.x + source_mc.width;
    bitmap.y = source_mc.y + source_mc.height - bitmap.height;
    this.addChild(bitmap);
}

參考資料

關於 XML(一)使用 Flash 載入 XML 資料

var verLoader:URLLoader = new URLLoader(new URLRequest("version.xml"));
verLoader.addEventListener(Event.COMPLETE,OnComplete);
function OnComplete()
{
	var verXML:XML = new XML(verLoader.data);
	trace(verXML);
}

var articleXML:XML = new XML(articleLoader.data);
var i:Number=0;

while(articleXML.article[i])
{
	articles[i]=new Object();
	articles[i].aid=articleXML.article[i].aid;
	articles[i].photo=articleXML.article[i].photo;
	articles[i].title=articleXML.article[i].title;
	articles[i].description=articleXML.article[i].description;
	i++;
}

自定義附帶傳送參數事件

建構事件

package
{
	import flash.events.Event;
	public class MuseumEvent extends Event
	{
		public static const CHANGE_ROOM:String = "CHANGE_ROOM";
		public var data:Object;
		public function MuseumEvent(_type:String, _bubble:Boolean = false , _object:Object = null)
		{
			super(_type, _bubble, false);
			data = _object;
		}
	}
}

使用事件

// 收
this.addEventListener(MuseumEvent.CHANGE_ROOM,OnChangeRoom);

// 發
dispatchEvent(new MuseumEvent(MuseumEvent.CHANGE_ROOM,true,{room:"LOBBY"}));

// 執行
function OnChangeRoom(evt:MuseumEvent){trace(evt.data.zoom);}

Kinect for AS3 錯誤說明

[ 1 ] Question :
error on accept<> for data, exit data thread. 10093

[ 1 ] Solution :
關閉重複開啟的 as3-server.exe

—————————————————————————————————————

使用 DataGrid

建立一個 DataGrid

import fl.controls.dataGridClasses.DataGridColumn;

//------------------------------------------------------------| 宣告欄位的名稱

var ID:DataGridColumn = new DataGridColumn("ID");
var time:DataGridColumn = new DataGridColumn("time");
var captionAb:DataGridColumn = new DataGridColumn("captionAb");
var captionCh:DataGridColumn = new DataGridColumn("captionCh");

//------------------------------------------------------------| 更改欄位的標籤

ID.headerText = "ID";
time.headerText = "時間";
captionAb.headerText = "原文";
captionCh.headerText = "中文";

//------------------------------------------------------------| 設定欄位的寬度

ID.width = 40;
time.width = 40;
captionAb.width = 250;
captionCh.width = 150;

//------------------------------------------------------------| 設定排序方式

ID.sortOptions = Array.NUMERIC;

//------------------------------------------------------------| 將欄位指定給 DtaGrid

var dgCols:Array = [ID, time,captionAb,captionCh];
caption_dg.columns = dgCols;

//------------------------------------------------------------| 新增資料

caption_dg.addItem(
{
    ID:i+1,
    time:CaptionInfo.captions_time[i],
    captionAb:CaptionInfo.captions_captionAb[i],
    captionCh:CaptionInfo.captions_captionCh[i]
});

常用的事件

項目點選時

fl.events.ListEvent.ITEM_CLICK

項目變更時

flash.events.Event.CHANGE

關於外部類別

若是一直出現 1172: 找不到定義 fl.controls.dataGridClasses。之類的錯誤的話

可以試著把組件拉到主場景上然後再刪掉該組件, 讓元件庫裡面有該組件會用到的元件即可

主場景
import Code.MicrophoneManager;
var MM:MicrophoneManager=new MicrophoneManager();
// 記得要把 MM 丟上舞台才會出現, 若沒有 addChild 就看不到
this.addChild(MM);

載入進度 ProgressEvent

 

package
{
  import flash.display.*;
  import flash.events.*;
  import flash.net.*;
  public class ProgressBar_Example extends Sprite
  {
    private var loader:Loader=new Loader;
    private var path:String="test.jpg";
    public function ProgressBar_Example()
    {
      // 載入時
      loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
      
      // 載完時
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
      
      // 實體化
      addChild(loader);
      
      // 載入檔案
      loader.load(new URLRequest(path));
    }
    
    // 載入時

    private function onProgress(evt:ProgressEvent):void
    {
      // 已經載入的 bytes 量
      var loaded:Number = evt.bytesLoaded;
      
      // 需要載入的 bytes 量
      var total:Number = evt.bytesTotal;
      
      // 載入百分比
      var percentage:Number = Math.floor(loaded / total * 100);
      
      trace("讀取進度 : "+loaded + "/" +total + " 讀取百分比:"+percentage+" %");
    }
    
    // 載完時

    private function onComplete(evt:Event):void
    {
      trace("讀取完成");
    }
  }
}

 

ComboBox 欄位與下拉選單的文字設定

假如說我今天要修改 ComboBox 裡面的文字格式要怎麼辦呢 ?
試試以下的方法吧:

import flash.text.TextFormat;

var TF:TextFormat = new TextFormat();
TF.size = 12; // 其他文字的格式設定也是依此類推...

// 設定 ComboBox 那個欄位的字 <註一>
ComboBox_cb.setStyle("textFormat",TF);

// 設定 ComboBox 開啟後的選單
ComboBox_cb.dropdown.setRendererStyle("textFormat",TF);

————————————————————————————————

註一:
這邊原本是用

ComboBox_cb.textField.setStyle("textFormat",TF);
但很容易就變回原形了
所以直接改成下面這樣就沒問題了

ComboBox_cb.setStyle("textFormat",TF);

文字欄位的文字新增位置

假如說我們今天有一段文字想加入原本的文字裡,可能會有下列情況

  • 加在前面
  • 加在後面
以下分別針對各種不同的情況做說明:

首先先設定好環境

package
{
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.text.*;
  import flash.events.*;
  public class TextTest extends Sprite
  {
    public function TextTest()
    {
      Button_1_btn.addEventListener(MouseEvent.CLICK,onClick);
      Button_2_btn.addEventListener(MouseEvent.CLICK,onClick);
    }
    public function onClick(evt:MouseEvent):void
    {
      switch (evt.target.name)
      {
        case "Button_1_btn" :
          output_txt.text=input_txt.text+"\n"+output_txt.text;
          break;
        case "Button_2_btn" :
          output_txt.appendText(input_txt.text+"\n");
          break;
      }
    }
  }
}

使用方法:
  在上面的輸入欄位輸入文字
  然後在右邊的按鈕選擇動作
  下面的輸出欄位會顯示文字

替代 IOErrorEvent 事件中 errorId 的方法

因為 errorId 只能在 Adobe AIR 裡面用
所以如果想知道
errorId 的話可以用下面的方法來做:

theError_ldr.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
function ioErrorHandler(evt:IOErrorEvent):void
{
  var errorTargetName:String=evt.target.name;
  // trace(evt.target.name) >>> theError_ldr
  var defaultURL:String="Picture/System/sample.jpg";
  var errorId:String=evt.text.slice(7,11);

  /*
    trace(evt.text); 的話會出現
    Error #2035: 找不到 URL。
    URL: file:///D|/工作室/0031%5F線上測驗/student/Picture/99/20-1.jpg

    這個時候我們取從第 7 個字後開始到第 11 個字結束
    也就是 Error #2035: 找不到 URL。...
    剛好他就是我們要的 ID
    這樣一來就可以針對 errorID 用 switch 來判斷各種不同的錯誤要做哪些事情了
  */

  switch (errorId)
  {
    case "2035" :
      trace("錯誤代碼是 : "+errorId);
      pictureRequest.url=defaultURL;
      this[errorTargetName].load(pictureRequest);
      break;
  }
}