2009-08-28 46 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); 


    } 

} 

}

相關問題