Flash / AS3中的字体指标

时间:2010-01-06 15:57:01

标签: actionscript-3 fonts

我有一个项目,我将在圆圈上渲染文本路径;文本必须是动态的,所以我不能只是从插图画家那里带来一个预先计算好的集合。

现在,在圆圈上放置文字应该不会太难,我会按角色每个角色进行操作。麻烦的是,我似乎无法弄清楚如何从flash的字体引擎获得每个字符的进展。 99%的可能性我只是忽略了一些明显的东西。但据我所知,获取Flash字体指标的唯一方法是通过flash.text.engine.FontMetrics,表面上是每个字体,而不是每个字符。

有什么想法吗?

我不期待实现的后备是我自己预先计算每个字符的进度(因为这个项目将使用预先知道的嵌入字体)。我有用于生成opengl的字形映射的ObjC代码,所以我可以离线生成该数据并使其可用于我的flash代码(可能是静态常量或某些malarkey)。

P.S。这是关于StackOverflow的第一个问题,如果我问的不好,请告诉我。

4 个答案:

答案 0 :(得分:2)

import flash.text.TextLineMetrics;

Docs

并使用

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 - 查找子串坐标,线宽等等