2012-07-11 39 views
0

我试图在贝塞尔曲线上放置动态生成的文本 - 文本长达12个字符,所以需要调整到中心。在贝塞尔曲线上创建动态文本字段 - AS3

我找不到任何企图在谷歌上做到这一点。

我唯一的猜测是读一个贝塞尔曲线xy,然后将textfield放在那,但我怎么会得到文本字段以适应曲线?

谢谢!

马库斯

+0

嗨马库斯, 你是想适应一个“动态曲线”,或者它是一个弧或圆? – Drala 2012-07-11 13:25:24

回答

4

如果你的曲线是圆弧或圆我刚才正确的事情你:P 我做了两个班,前一段时间在此处理这一点,他们来了:

package com.display{ 

    import flash.display.Sprite; 

    import utils.Utils; 

    public class PathText extends Sprite 
    { 
     private var _text:String; 
     private var _chars:Array; 
     private var _startAngle:Number; 
     private var _stopAngle:Number; 
     private var _radius:Number; 


     public function PathText(__text:String, __radius:Number) 
     { 
      super(); 

      this.mouseChildren = false; 
      this.mouseEnabled = false; 
      _text = __text; 

      _startAngle = 0; 
      _radius = __radius; 
      _chars = new Array(); 

      init(); 

     } 

     private function init():void 
     { 
      for(var i:int = 0; i < _text.length; i++) 
      { 
       var char:Char = new Char(_text.charAt(i)); 
       _chars.push(char); 
      } 
      drawArc(_radius); 
     } 

     public function drawArc(rad:Number):void 
     { 
      var lastAngle:Number = 0; 
      for(var i:int = 0; i < _chars.length; i++) 
      { 
       var angle:Number = 2 * Math.sin((_chars[i].width/2)/rad); 

       _chars[i].rotation = radiansToDegrees(lastAngle) + 90; 
       _chars[i].x = rad * Math.cos(lastAngle); 
       _chars[i].y = rad * Math.sin(lastAngle); 
       lastAngle += angle; 
       addChild(_chars[i]); 
      } 

      _stopAngle = radiansToDegrees(lastAngle); 
     } 

     public function destroy():void 
     { 
      for(var i:int = _chars.length; i >= 0; i--) 
      { 
       removeChild(_chars[i]); 
       _chars.pop().destroy(); 
      } 
     } 

     public function get startAngle():Number 
     { 
      return _startAngle; 
     } 

     public function set startAngle(value:Number):void 
     { 
      _startAngle = value; 
     } 

     public function get stopAngle():Number 
     { 
      return _stopAngle; 
     } 

     public function set stopAngle(value:Number):void 
     { 
      _stopAngle = value; 
     } 

     private function radiansToDegrees(radians:Number):Number 
     { 
      return radians * 180/Math.PI; 
     } 

    } 
} 

与焦炭类:

package com.display 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.text.TextFieldAutoSize; 
    import flash.text.TextFormat; 

    public class Char extends Sprite 
    { 
     private var _str:String; 

     public function Char(__str:String) 
     { 
      super(); 

      _str = __str; 
      this.mouseChildren = false; 
      this.mouseEnabled = false; 
      init(); 
     } 

     private function init():void 
     { 
      var _tf:TextField  = new TextField(); 
      _tf.defaultTextFormat = new TextFormat("Some Font here", 15, 0xffffff); 
      _tf.embedFonts   = true; 
      _tf.mouseEnabled  = false; 
      _tf.selectable   = false; 
      _tf.text    = _str; 
      _tf.autoSize   = TextFieldAutoSize.LEFT; 
      _tf.width    = _tf.textWidth; 
      addChild(_tf); 
     } 

     public function destroy():void 
     { 
      this.removeChildAt(0); 
     } 

     public function get str():String 
     { 
      return _str; 
     } 

     public function set str(value:String):void 
     { 
      _str = value; 
     } 

    } 
} 

告诉我,如果你的作品... 喝彩!

+0

'PathText#destroy()'是越野车。应该是'> ='而不是'>'。对我来说似乎很好。 – Florent 2012-07-11 14:02:23

+0

谢谢Florent,我修复了我的帖子。 – Drala 2012-07-11 17:25:15