這裏有沒有人想出一個優雅的方式來採取一段文字,並使其圍繞一條線的邊緣扭曲? (具體來說,是圓形的,但我確定一旦它跟隨線條,形狀就不相關)。我找不到如何做到這一點的好資源。我假設我需要爲每個角色創建單獨的影片剪輯,然後旋轉和定位,但我很難找到如何執行此操作的資源。有沒有一種方法可以在ActionScript中將文本轉換爲圓形?
編輯:對不起,很明顯,忘記提到文字是動態的。我對如何讓靜態文本進入圈子不感興趣:)
這裏有沒有人想出一個優雅的方式來採取一段文字,並使其圍繞一條線的邊緣扭曲? (具體來說,是圓形的,但我確定一旦它跟隨線條,形狀就不相關)。我找不到如何做到這一點的好資源。我假設我需要爲每個角色創建單獨的影片剪輯,然後旋轉和定位,但我很難找到如何執行此操作的資源。有沒有一種方法可以在ActionScript中將文本轉換爲圓形?
編輯:對不起,很明顯,忘記提到文字是動態的。我對如何讓靜態文本進入圈子不感興趣:)
我已經提出了一個例子,用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;
}
}
}
這非常棒。
最簡單的事情就是創建一個帶有文本框的動畫片段並對齊,以便文本框的左下邊緣位於動畫片段。您需要將textfield的autosize屬性設置爲「左」,以便每個字母都能根據需要逐漸增大(這將幫助您獲得正確的字距)。
然後你只需循環你的句子,併爲每個字母創建一個動畫片段。唯一困難的部分是獲得下一封信的位置。
我以前解決過這個問題的一種方法,可以使用任何可能需要的線條或曲線,就是創建一個非常長的動畫(至少幾百幀)我想要的曲線。那就是我複製的那個動畫片段。然後,我只需爲每個字母選擇停止的動畫幀 - 這將決定每個字母的文本字段實際顯示的位置。這是一種黑客攻擊,但過去它運行良好。
我上投票你的答案,但我希望有人可以給我一個指針到一個更加程序化的解決方案,儘管我喜歡你的黑客......它很聰明,即使不是太優雅。 – 2009-08-28 21:49:36
什麼工作對我來說 我只想代表和圓形軌道上移動文本
包 {
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);
}
}
}
還沒有嘗試過,但它看起來很有前途,一目瞭然。一個問題......如果你想要文本只是追隨新月怎麼辦? (半圓) – 2009-09-01 23:03:04
如果您查看CircleText的構造函數,則可以看到名爲coverage的參數。它代表了文本應該佔據多少圈。對於一個半圓你放0.5。對於四分之一的圓你放0.25等等。當然,全圓的覆蓋率= 1。 – Virusescu 2009-09-02 21:59:50