2009-08-28 77 views
1

这里有没有人想出一个优雅的方式来采取一段文字,并使其围绕一条线的边缘扭曲? (具体来说,是圆形的,但我确定一旦它跟随线条,形状就不相关)。我找不到如何做到这一点的好资源。我假设我需要为每个角色创建单独的影片剪辑,然后旋转和定位,但我很难找到如何执行此操作的资源。有没有一种方法可以在ActionScript中将文本转换为圆形?

编辑:对不起,很明显,忘记提到文字是动态的。我对如何让静态文本进入圈子不感兴趣:)

回答

4

我已经提出了一个例子,用2个类写在圈子上。 为了达到这个目的,你需要在你的类库中加入一个类名为的字母文字。这是为了简化文本操作。 Letter需要有一个TextField,至少2个字母宽,实例名称为,值为。文本应该居中以及文本字段本身,居中为精灵的0.0坐标。

所以。 DocumentClass.as

package { 

    import flash.display.Sprite; 

    public class DocumentClass extends Sprite { 

     public function DocumentClass() { 
      // draw on circle tester 

      var c1:CircleText = new CircleText(200, 200, 90, "Hello World - Circle Text", 0.5, -90); 
      var c2:CircleText = new CircleText(300, 300, 50, "Hope you like this", 0.6, -90, true); 
      var c3:CircleText = new CircleText(420, 200, 50, "By Virusescu", 0.35, -60); 

      this.addChild(c1); 
      this.addChild(c2); 
      this.addChild(c3); 


     } 

    } 


} 

Letter.as 包{

import flash.text.TextField; 
import flash.display.Sprite; 

public class Letter extends Sprite { 

    // public var value:TextField; // defined by IDE 

    public function Letter(val:String) { 
     this.value.text = val; 
    } 

} 

}

CircleText.as

package { 

    import flash.display.Sprite; 

    public class CircleText extends Sprite { 

     public function CircleText(centerX:Number, centerY:Number, radius:Number, string:String, coverage:Number, startAngle:Number, showCircle:Boolean = false) { 

      if (showCircle) { 
       this.graphics.lineStyle(1, 0xFF0000, 0.5); 
       this.graphics.drawCircle(0, 0, radius); 
      } 


      var step = 360*coverage/(string.length-1); 
      // convert to radians 
      step = step * Math.PI/180; 

      for (var s = 0; s < string.length; s++) { 
       var letter:Letter = new Letter(string.charAt(s)); // from library, check description below 
       letter.x = radius*Math.cos(step*s); 
       letter.y = radius*Math.sin(step*s); 
       letter.rotation = (step*s)*180/Math.PI + 90; 
       this.addChild(letter); 
      } 
      this.x = centerX; 
      this.y = centerY; 
      this.rotation = startAngle - 90; 
     } 
    } 
} 

这非常棒。

+0

还没有尝试过,但它看起来很有前途,一目了然。一个问题......如果你想要文本只是追随新月怎么办? (半圆) – 2009-09-01 23:03:04

+0

如果您查看CircleText的构造函数,则可以看到名为coverage的参数。它代表了文本应该占据多少圈。对于一个半圆你放0.5。对于四分之一的圆你放0.25等等。当然,全圆的覆盖率= 1。 – Virusescu 2009-09-02 21:59:50

1

最简单的事情就是创建一个带有文本框的动画片段并对齐,以便文本框的左下边缘位于动画片段。您需要将textfield的autosize属性设置为“左”,以便每个字母都能根据需要逐渐增大(这将帮助您获得正确的字距)。

然后你只需循环你的句子,并为每个字母创建一个动画片段。唯一困难的部分是获得下一封信的位置。

我以前解决过这个问题的一种方法,可以使用任何可能需要的线条或曲线,就是创建一个非常长的动画(至少几百帧)我想要的曲线。那就是我复制的那个动画片段。然后,我只需为每个字母选择停止的动画帧 - 这将决定每个字母的文本字段实际显示的位置。这是一种黑客攻击,但过去它运行良好。

+0

我上投票你的答案,但我希望有人可以给我一个指针到一个更加程序化的解决方案,尽管我喜欢你的黑客......它很聪明,即使不是太优雅。 – 2009-08-28 21:49:36

0

什么工作对我来说 我只想代表和圆形轨道上移动文本

包 {

import flash.text.TextField; 
import flash.display.Sprite; 
import flash.text.TextFormat; 
import flash.text.Font; 

public class Letter extends Sprite 
{ 

    public var vale:TextField; // defined by IDE 

    public function letter(val:String):TextField 
    { 
     vale=new TextField(); 
     this.vale.text=val; 
     var frmt:TextFormat= new TextFormat(); 
     frmt.color="0X00FF00"; 
     frmt.size=14; 
     this.vale.setTextFormat(frmt); 
     this.vale.textColor=0X00FF00; 
     return vale; 

    } 

} 

}

包{

import flash.display.Sprite; 

import flash.text.TextField; 公共类CircleText扩展Sprite {

public function CircleText(centerX:Number, centerY:Number, radius:Number, string:String, coverage:Number, startAngle:Number, showCircle:Boolean = false) { 

      if (showCircle) { 
        this.graphics.lineStyle(1, 0xFF0000, 0.5); 
        this.graphics.drawCircle(0, 0, radius); 
      } 


      var step = 360*coverage/(string.length-1); 
      // convert to radians 
      step = step * Math.PI/180; 

      for (var s = 0; s < string.length; s++) { 
        var letter:TextField = new Letter().letter(string.charAt(s)); // from library, check description below 
        letter.x = radius*Math.cos(step*s); 
        letter.y = radius*Math.sin(step*s); 
        letter.rotation = (step*s)*180/Math.PI + 90; 
        trace(letter.x, letter.y); 
        this.addChild(letter); 
      } 
      this.x = centerX; 
      this.y = centerY; 
      this.rotation = startAngle - 90; 
    } 
} 

}

包{

import flash.display.Sprite; 

public class DocumentClass extends Sprite { 

    public function DocumentClass() { 
      // draw on circle tester 

      var c1:CircleText = new CircleText(200, 200, 90, "Hello World - Circle Text", 0.5, -90); 
      var c2:CircleText = new CircleText(300, 300, 50, "Hope you like this", 0.6, -90, true); 
      var c3:CircleText = new CircleText(420, 200, 50, "By Virusescu", 0.35, -60); 

      this.addChild(c1); 
      this.addChild(c2); 
      this.addChild(c3); 


    } 

} 

}

相关问题