在 AS2/AS3 中,直接設置 textField._alpha = 50 (AS2) 或 textField.alpha = 0.5 (AS3) 對於「動態文本」或「輸入文本」類型**完全無效**——文本依然不透明。這是因為 Flash 為了渲染性能,對可編輯文本採用特殊繪製路徑,繞過了常規 DisplayObject 的 Alpha 混合管線。
給文本框添加**任意一個濾鏡**(哪怕參數全為 0),Flash 會將該文本框內部轉為「位圖模式」快取,此時 Alpha 設置即刻生效。
import flash.filters.BlurFilter;
// 啟用 Alpha:添加零參數模糊濾鏡
function enabledAlpha(obj:Object):Void {
obj.filters = [new BlurFilter(0, 0, 0)]; // blurX=0, blurY=0, quality=0
}
// 禁用 Alpha:移除濾鏡恢復原生文本渲染(銳利、可編輯)
function disabledAlpha(obj:Object):Void {
obj.filters = null;
}
// 使用示例
var txt:TextField; // 假設舞台上有動態文本實例名 txt
enabledAlpha(txt);
txt._alpha = 50; // 50% 半透明,生效!
import flash.filters.BlurFilter;
import flash.text.TextField;
function enabledAlpha(tf:TextField):void {
tf.filters = [new BlurFilter(0, 0, 0)];
}
function disabledAlpha(tf:TextField):void {
tf.filters = null;
}
// 使用
enabledAlpha(myTextField);
myTextField.alpha = 0.5; // 0.0 - 1.0
BlurFilter(0,0,0) 不產生任何模糊,純粹作為「啟用位圖快取」的開關。| 影響 | 說明 | 應對 |
|---|---|---|
| 文本不可編輯 | 啟用濾鏡後,輸入文本無法輸入/選中 | 僅在需要半透明的「展示態」啟用,編輯態調用 disabledAlpha() |
| 文字銳度下降 | 位圖快取受舞台縮放影響,放大時模糊 | 避免縮放文本框;或改用 embed 字體 + 矢量渲染 |
| 性能開銷 | 每幀重繪位圖快取 | 靜態文本無大礙;大量動態更新文本慎用 |
| 無法使用高級排版 | TextLayoutFramework (TLF) 文本不支援此法 | TLF 文本請用 textFlow.hostFormat.alpha 或容器 Sprite.alpha |
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 濾鏡法(本文) | 代碼極簡、即時生效、AS2/AS3 通用 | 失去編輯能力、放大模糊 | 靜態展示、簡單半透明特效 |
| draw() 繪製到 BitmapData | 完全控制、可做進一步像素處理 | 代碼複雜、需手動同步更新 | 複雜合成、遮罩、特效後處理 |
| 嵌入字體 + 矢量 + 容器 Sprite.alpha | 矢量銳利、保留編輯、無副作用 | 嵌入字體增大體積、設置繁瑣 | 高質量出版級、需縮放的文本 |
| TLF TextFlow.alpha (AS3/Flex) | 原生支援、功能完整 | 僅限 TLF、框架較重 | Flex 應用、富文本編輯器 |
enabledAlpha/disabledAlpha 放入通用工具包 TextUtils,專案統一調用。「給動態文本加個零模糊濾鏡」——這個看似駭客的技巧,實則利用了 Flash Player 渲染管線的「濾鏡即快取」機制。理解其本質,才能在遇到 TLF、Stage3D、Feathers 等新框架時,舉一反三找到對應的「位圖化開關」。技巧會過時,原理永流傳。