噗浪上有朋友說 TextField 設定 autoSize 之後放在 MovieClip 內
隨著 MoiveClip scaleX, scaleY 改變
居然會影響到 TextField 的 width 與 textWidth
測試程式如下:

package {
 import flash.display.Sprite;
 import flash.text.TextField;
 
 public class TextFieldSize extends Sprite {
  public function TextFieldSize() {
   var txt:TextField = new TextField();
   txt.text = "0";
   txt.autoSize = "left";
 
   var sp:Sprite = new Sprite();
   sp.addChild(txt);
 
   trace(txt.width, txt.textWidth); // 64 60
 
   sp.scaleX = 2;
   trace(txt.width, txt.textWidth); // 34 30
 
   sp.scaleX = 3;
   trace(txt.width, txt.textWidth); // 24 20
  }
 }
}

其實這問題很容易解決,只要嵌入字體或者是設定一個 Matrix3D 到 TextField 上就好了

我在測試時發現它的數值變化很有趣,是跟外層容器 Scale 大致成反比的
另外,有開發過滿版 Flash 應該都知道,必須要將 stage.scaleMode 設為 noScale 才能偵測到實際舞台尺寸
於是就想是否能利用 TextField 這個特性,來偵測縮放模式為 ShowAll 的舞臺尺寸呢?

反覆測試幾次之後,發現是可行的
只是作法略有變化,另外算出來的數值略有誤差,不過是可以忍受的
以下便是利用 TextField 縮放特性,算出舞台縮放比,讓一個正方形 Sprite 不被縮放並且置中

package {
 import flash.display.Graphics;
 import flash.display.Sprite;
 import flash.display.StageScaleMode;
 import flash.events.Event;
 import flash.text.TextField;
 
 /**
  * Detect scale of stage with show all mode by TextField.textWidth
  * @author Ticore Shih - http://ticore.blogspot.com/
  */
 public class StageScaleDetector extends Sprite {
 
  public var txt:TextField = new TextField();
  public var stdTextWidth:Number;
 
  public var sp:Sprite = new Sprite();
 
  public function StageScaleDetector() {
   stage.scaleMode = StageScaleMode.SHOW_ALL;
 
   initDetector();
   initBackground();
   initSprite();
 
   addEventListener(Event.ENTER_FRAME, onStageResize);
  }
 
  public function initDetector():void {
   txt.text = "-";
   txt.rotation = 90;
   addChild(txt);
   stdTextWidth = txt.textWidth;
  }
 
  public function initBackground():void {
   var g:Graphics = this.graphics;
   g.lineStyle(10, 0x808080);
   g.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
  }
 
  public function initSprite():void {
   var g:Graphics = sp.graphics;
   g.lineStyle(3, 0);
   g.beginFill(0, 0.5);
   g.drawRect(0, 0, 100, 100);
   g.endFill();
   addChild(sp);
  }
 
  public function onStageResize(e:Event):void {
   var stageScale:Number = stdTextWidth / txt.textWidth;
   sp.scaleX = sp.scaleY = 1 / stageScale;
   sp.x = (stage.stageWidth - sp.width) / 2;
   sp.y = (stage.stageHeight - sp.height) / 2;
  }
 }
}

畫面截圖