Метрики шрифта в Flash / AS3 - PullRequest
1 голос
/ 06 января 2010

У меня есть проект, в котором я буду отображать текстовые контуры по кругу; текст должен быть динамическим, поэтому я не могу просто ввести предварительно вычисленный набор из иллюстратора.

Теперь, наложение текста на круг не должно быть слишком сложным, я сделаю это для каждого персонажа с поворотом на персонажа. Проблема в том, что я не могу понять, как получить продвижение за символ из движка шрифтов Flash. С вероятностью 99% я просто упускаю из виду нечто очевидное. Но, насколько я могу судить, единственный способ получить метрику шрифта flash - это flash.text.engine.FontMetrics , который якобы для каждого шрифта, а не для символа.

Есть идеи?

Откат, который я не собираюсь реализовывать, - это предварительное вычисление авансов на каждый символ (поскольку в этом проекте будут использоваться заранее известные встроенные шрифты). У меня есть код ObjC для генерации карт глифов для opengl, поэтому я могу генерировать эти данные в автономном режиме и делать их доступными для моего флеш-кода (возможно, в виде статических констант или некоторой малярии).

P.S. Это мой первый вопрос по StackOverflow, если я плохо задал вопрос, пожалуйста, дайте мне знать.

Ответы [ 4 ]

2 голосов
/ 06 января 2010
import flash.text.TextLineMetrics;

Docs

и используйте

flash.text.TextField.getLineMetrics();

Итак, вы должны создать отдельный динамический TextField (динамически) для каждой буквы. Поместите свою первую букву (скажем, в TextField letter_1) и позвоните:

var TLM:TextLineMetrics = letter_1.getLineMetrics(0);

Это даст вам объект TextLineMetrics для первой строки (в вашем случае - одну букву). Затем используйте свойство width, чтобы определить, какое смещение необходимо для следующей буквы.

1 голос
/ 06 января 2010

Я должен был сделать нечто подобное давным-давно. Поскольку это был AS2, я использовал фрагмент от 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. Кривые Эрмита должны быть более точными.

Джим Армстронг - человек по математике. Его работа над Деграфа удивительна, если вы не ограничены, Деграфа уже имеет множество функций для подобных вещей.

НТН

0 голосов
/ 24 октября 2012

Greensock TextMetrics может быть полезен в этих ситуациях. Описание: TextMetrics - Найти координаты подстроки, ширину линии и многое другое

0 голосов
/ 06 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...