2014-03-04 70 views
0

我无法弄清楚处理flash中动态文本字段的一个简单问题。我没有脑细胞再和IM放弃..as3文本框错误还是什么?

var g = ['text dang', 'text deng', 'dong', 'laah', 'maah']; 

for(var q = 0; q < g.length; q++){ 
    var p = new grad_plate(); 
    p.name_field.multiline = false; 
    p.name_field.wordWrap = false; 
    p.name_field.autoSize = TextFieldAutoSize.LEFT; 
    p.name_field.text = g[q]; 
    p.name_field.width = p.name_field.textWidth; 
    p.plate_mc.width = p.name_field.width + 20; 
    p.width = p.plate_mc.width; 
    p.name = "name_" + q; 
    stage.addChild(p); 
    //p.x = q * stage.getChildAt(q).width; 
    //p.x = q * p.width; 
    p.x = q * 200; 
} 

我grad_plate()类包含的背景name_field文本框和plate_mc。

我想根据实例的宽度动态地设置每个实例的x。

给200(修复)正在工作,但我想动态获得p.width这让我一个丑陋的水平对齐。

+0

我想,也许你的布点代码将更好地工作,在下一帧之后的事情被添加到舞台(也许再textWidth或任何你想要的东西都是正确的计算,这只是一个猜测,我希望它有帮助,什么意思是使用settimeOut之类的东西来调用布局/设置代码,在事物添加到舞台之后) – simion314

回答

1

为你工作的例子,我认为有些部分会有所帮助。

package { 

    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.text.TextFormat; 

    public class StackOverflow extends Sprite { 
     public function StackOverflow() { 
      addEventListener(Event.ADDED_TO_STAGE, onAdded); 
     } 

     private function onAdded(e:Event):void { 
      removeEventListener(Event.ADDED_TO_STAGE, onAdded); 

      stage.align = StageAlign.TOP_LEFT; 
      stage.scaleMode = StageScaleMode.NO_SCALE; 

      setup(); 
     } 

     private function setup():void { 
      var texts:Array = ["some", "text", "here", "dynamic"]; 
      var i:uint, len:uint = texts.length, posX:uint, plate:Plate; 
      var textFormat: TextFormat = new TextFormat("Arial", 18, 0xFFFFFF, true); 

      for (i; i < len; ++i) { 
       plate = new Plate(texts[i], textFormat, Math.random() * 0xFFFFFF); 
       addChild(plate); 
       plate.x = posX; 
       posX += plate.width; 
      } 
     } 
    } 
} 

import flash.display.Graphics; 
import flash.display.Sprite; 
import flash.text.TextField; 
import flash.text.TextFieldAutoSize; 
import flash.text.TextFormat; 

internal class Plate extends Sprite { 

    public function Plate(text:String, textFormat:TextFormat, color:uint) { 
     const padding:int = 20; 
     var textField:TextField = new TextField(); 
     var g:Graphics = this.graphics; 
     textField.autoSize = TextFieldAutoSize.LEFT; 
     textField.defaultTextFormat = textFormat; 
     textField.multiline = false; 
     textField.wordWrap = false; 
     textField.text = text; 

     addChild(textField); 

     textField.x = textField.y = padding; 
     g.beginFill(color); 
     g.drawRect(0, 0, 2 * padding + textField.width, 2 * padding + textField.height); 
    } 
} 

结果,会是这个样子:

Result

+0

这是回答!在评论之前,我在我的项目中实现了您的答案,并且它确实有效。特别是plate.x = posX; posX + = plate.width; 谢谢先生! –