我有一个项目,我将在圆圈上渲染文本路径;文本必须是动态的,所以我不能只是从插图画家那里带来一个预先计算好的集合。
现在,在圆圈上放置文字应该不会太难,我会按角色每个角色进行操作。麻烦的是,我似乎无法弄清楚如何从flash的字体引擎获得每个字符的进展。 99%的可能性我只是忽略了一些明显的东西。但据我所知,获取Flash字体指标的唯一方法是通过flash.text.engine.FontMetrics,表面上是每个字体,而不是每个字符。
有什么想法吗?
我不期待实现的后备是我自己预先计算每个字符的进度(因为这个项目将使用预先知道的嵌入字体)。我有用于生成opengl的字形映射的ObjC代码,所以我可以离线生成该数据并使其可用于我的flash代码(可能是静态常量或某些malarkey)。
P.S。这是关于StackOverflow的第一个问题,如果我问的不好,请告诉我。
答案 0 :(得分:2)
import flash.text.TextLineMetrics;
并使用
flash.text.TextField.getLineMetrics();
因此,您将为每个字母创建一个单独的动态TextField(动态)。放置您的第一个字母(例如在TextField letter_1中)并致电:
var TLM:TextLineMetrics = letter_1.getLineMetrics(0);
这将为您提供第一行的TextLineMetrics对象(在您的情况下为单个字母。)然后使用width属性确定下一个字母需要多少偏移量。
答案 1 :(得分:1)
很久以前我不得不做类似的事情。由于它是AS2,我使用了snippet by senocular.
如果你想要一行中的字母,使用textWidth:
就足够了var theText:String = 'text on a path';
var letters:Array = [];
var lettersNum:int = theText.length;
for(var i:int = 0; i < lettersNum; i++){
var t:TextField = new TextField();
t.defaultTextFormat = new TextFormat('Verdana',12,0x000000);
t.embedFonts = true;
t.text = theText.charAt(i);
t.selectable = false;
letters.push(t);
addChild(t);
if(i > 0) t.x = letters[i-1].x + letters[i-1].textWidth;
}
我尝试使用TweenMax将事情快速放在路上。
import com.greensock.*;
import com.greensock.easing.*;
import com.greensock.plugins.*;
TweenPlugin.activate([BezierThroughPlugin, BezierPlugin]);
var theText:String = 'text on a path';
var letters:Array = [];
var lettersNum:int = theText.length;
for(var i:int = 0; i < lettersNum; i++){
var t:TextField = new TextField();
t.defaultTextFormat = new TextFormat('Verdana',12,0x000000);
t.embedFonts = true;
t.text = theText.charAt(i);
t.selectable = false;
letters.push(t);
addChild(t);
//if(i > 0) t.x = letters[i-1].x + letters[i-1].textWidth;
var tween:TweenMax = TweenMax.to(t, 3, {bezierThrough:[{x:0, y:0},{x:50, y:50},{x:100, y:0}], orientToBezier:true, ease:Linear.easeNone});
tween.complete(true,true);
tween.currentProgress = i/lettersNum;
}
不是很好。将TextFields嵌套在一些精灵中,调整路径上字母的位置(垂直偏移)会很方便,而且间距是一个问题,因为BezierThrough正在使用Quadratic Beziers。 Hermite曲线应该更精确。
Jim Armstrong是数学的人。他对Degrafa的工作是惊人的,如果你没有约束,Degrafa已经有很多这方面的功能。
HTH
答案 2 :(得分:0)
答案 3 :(得分:0)
Greensock的TextMetrics在这些情况下非常有用。说明:TextMetrics - 查找子串坐标,线宽等等