萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

ActionScript 3.0 實用技巧總匯

ActionScript 3.0 開發實用技巧總覽

以下技巧均源自實際專案經驗,在 Flex 2 / AS3 環境下驗證可行,涵蓋 JS 互調、記憶體管理、效能優化、型別判斷與轉換、計時器使用、存取控制、迴圈差異、物件特性、工具提示控制、反射機制、時區已知問題、字串替換、深度複製及 mx_internal 命名空間等進階主題。

一、ExternalInterface:AS 與 JavaScript 雙向通訊

AS 呼叫 JS

ExternalInterface.call("jsFunctionName", paramsArray); // 可接收回傳值

JS 呼叫 AS

// AS 端註冊回呼
ExternalInterface.addCallback("jsCallableName", asFunction);

// JS 端呼叫
swfObjectName.jsCallableName(args);

二、物件清理與記憶體管理

AS3 採用垃圾回收機制:當物件不再被任何參考指向時,會在不確定時間被回收。因此必須主動清理:

  • 移除事件監聽器(removeEventListener)
  • 清空陣列、字典、向量等容器
  • 將不再使用的物件參考設為 null

否則會造成記憶體長期佔用,導致效能下降。

三、重繪效能陷阱

即使被遮擋的顯示物件,Flash Player 依然會對其進行重繪。例如在同一位置持續繪製數百上千層圓形,滑鼠經過時 CPU 會飆升,但記憶體不會增加。解決方案:將不可見物件的 visible = false 或從顯示清單移除(removeChild)。

四、型別判斷與轉換

操作語法說明
判斷型別if (obj is MyClass)回傳 Boolean
取得型別名稱typeof obj回傳字串,如 "object", "function", "xml" 等
安全轉型var a:MyClass = b as MyClass;轉型失敗回傳 null,不拋出錯誤
強制轉型var a:MyClass = MyClass(b);轉型失敗拋出 TypeError
判斷是否為數字isNaN(expr)是數字回傳 false,非數字回傳 true

五、Timer 使用注意事項

  • Timer 精度有限,不適合高精度計時
  • 間隔建議不低於 10 毫秒,過低會導致 CPU 負載過高

六、存取控制修飾字

修飾字可存取範圍
private僅限類別本身內部
protected類別本身及其子類別
internal同一套件內的所有類別(預設)
public任何地方皆可存取

七、for...in vs for each...in

var obj:Object = {name1:"value1", name2:"value2"};

// for...in 取得鍵名
for (var key:String in obj) {
    trace(key); // name1, name2
}

// for each...in 取得值
for each (var value:String in obj) {
    trace(value); // value1, value2
}

八、物件互相轉換特性

AS3 中所有物件預設可相互轉換,例如陣列可當作 Map 使用(arr["key"] = value),但這樣會失去陣列的順序性保證。

九、ToolTip 顯示控制

  1. 禁止截斷顯示省略號:this.truncateToFit = false;
  2. 完全隱藏 ToolTip:覆寫 updateDisplayList,最後設定 super.toolTip = null;(仍會顯示省略號)

十、反射:依類別名稱實例化

var className:String = "com.example.MyClass";
var classType:Class = flash.utils.getDefinitionByName(className) as Class;
var instance:* = new classType();

十一、格林威治時間格式化已知 Bug

在中國時區(GMT+8)下,格式化 1970/01/01 08:00 會出錯,確認為 Flex SDK 的時區處理缺陷。

十二、字串全域替換

AS3 無 replaceAll,使用正則表達式全域旗標 g:

var testStr:String = "00:00:00";
var result:String = testStr.replace(/:/g, " "); // "00 00 00"

十三、物件深度複製

利用 ByteArray 序列化/反序列化實現深層克隆:

private function clone(source:Object):* {
    var ba:ByteArray = new ByteArray();
    ba.writeObject(source);
    ba.position = 0;
    return ba.readObject();
}

十四、mx_internal 命名空間覆寫(不建議常規使用)

import mx.core.mx_internal;
use namespace mx_internal;

// 之後即可覆寫標記為 mx_internal 的方法
copyright © 萬盛學電腦網 all rights reserved