Просмотр полной версии : TextFormat.getTextExtent работает неверно
romantique
26.07.2007, 11:56
var newstyle:TextFormat = new TextFormat();
newstyle.bold = true;
newstyle.color = 0x990000;
newstyle.font = "Courier New";
newstyle.size = this.__font_sizes[fs];
var metrics:Object = newstyle.getTextExtent(CodeText.text);
CodeText.setTextFormat(newstyle);
// CodeText:TextField
CodeText._width = metrics.width+4; // 2 gutters, every is 2 pixels
CodeText._height = metrics.height+4; // same
Текст не влазит в TextField. Почему?
Вообше говоря, autoSize автоматом такие вещи делает.
А текст не влезает, судя по всему из-за того что размер текста не указан (массив не существует, либо fs).
CrazyFlasher
26.07.2007, 12:58
кстати autoSize не со всеми фонтами верно работает.
CrazyFlasher
26.07.2007, 13:47
//Сделано на скорую руку и покорявому =)
//на сцене: sendBtn - кнопка
// input - текстовое поле
i = 1;
textY = 0;
lineHeight = input.textHeight;
sendBtn.onRelease = function(){
createText();
}
function createText(){
this.createTextField("m"+i, i, 0, textY, input.textWidth, lineHeight);
createField();
this["m"+i].text = input.text;
input.text = "";
textY += lineHeight;
i++;
}
function createField(){
this["m"+i].type = "dynamic"
this["m"+i].border = true;
this["m"+i].multiline = true;
this["m"+i].color = 0x000000;
}
к примеру, здесь не верно работает. по крайней мере у меня. шрифт на инпуте стоит "Times New Roman"
В приведенном коде autoSize отсутствует.
CrazyFlasher
26.07.2007, 13:55
чёрт возьми =) точно...извиняюсь за невнимательность =)
romantique
26.07.2007, 13:56
Вообше говоря, autoSize автоматом такие вещи делает.
А текст не влезает, судя по всему из-за того что размер текста не указан (массив не существует, либо fs).
Не работает даже при явном указании размера.
newstyle.size = 12;
Попробовал найти иное решение:
пробежался по всей строке, и складывал в одну переменную все значения metrics.width, взятые от каждой буквы. Теперь работает пиксель в пиксель. Хотя решение наверное не самое красивое. Видимо то, что выдаёт getTextExtent() - это какое-то теоретическое значение, может он считает все буквы одинакового размера. В общем по логике вещей разницы быть не должно, взять getTextExtent() от всей строки, или пройтись по каждой буквы. Но она есть.
А у меня работает. В AS3 он, кстати, убран.
И, похоже, правильно это работает только для не-embed шрифтов.
romantique
26.07.2007, 14:09
Может ты проверял на короткой строчке... В общем у меня строка в линию, там несколько десятков тыщ символов (там типа символы нуклеотидов ДНК), вот на ней разница видна конкретно... По несколько сотен символов не влазит.
На котротких у меня тоже работает, разницы не видно.
Может у мну руки не оттуда. Но я просто сравнил численно getTextExtent().width от строки, и сумма по всем getTextExtent().width от каждого символа - числа разные, клянусь.
Я бы посоветовал не извращаться и включить autoSize.
romantique
26.07.2007, 14:27
Мне не нужен автосайз. Всё что мне нужно, это по строке с заданным форматом абсолютно точно узнать, какова будет ширина текстового поля, в которое эта строка войдёт, не будет пустого места, но и не будет залазить. Я отталкиваюсь именно от размера шрифта, а не от масштаба, потмоу что размер шрифта - дискретная величина, а мувиклипы можно масштабировать непрерывно. Вот в этом и моя проблема. Использование autoSize не убирает дискретности размеров шрифтов.
Если кто то мне может сказать, как масштабировать шрифт с произвольной величиной (не только целой), то буду рад услышать. Конвертирование текста в кривые тоже не подойдёт, потому что одним из требований является возможность выделения текста.
Буду так же рад услышать безотказный способ определения ширины текста по формату, потом что способ предложенный мной два поста назад, как оказалось, тоже кривит.
Я не понял, нужно иметь возможность задавать размер шрифта непрерывной величиной?
romantique
26.07.2007, 14:40
Да, именно так.
Либо мне нужно задавать размер шрифта непрерывной величиной.
Либо мне нужно по строке и точно-заданному формату создать TextField такого размера, чтобы он был пиксель-в-пиксель подходящим для этой строки. Строка не должна залазить за текстовое поле ни на пиксел, и не должна не дотягивать до его края не на пиксел.
Собственно задача моя стоит в том, что есть двигающийся объект, на котором есть шкала с MovieClip'ами, а под ней текстовое поле, так что над каждой буквой ровно один мувиклип. Для масштабирования последнего в целях точного соответсвия я и хочу знать абсолютно точный размер текста.
romantique
26.07.2007, 14:45
Одно из решений я нашёл - экспериментально подобрать ширину буквы в пикселях для каждого размера шрифта. Тупо забить массив этими значениями, брать нужное и не париться. Работает вапще безотказно. Но это как то сильно завязано на наличие заданного шрифта в на машине - во первых. Во вторых даже если шрифт на данной машине есть - кто мне даст гарантию, что те пиксельные размеры, которые я перебором намерял буду ровно теме же.
Одно из решений было опять же портировать шрифты в флэшку, то есть юзать флэшный рендеринг шрифтов. Но на строке в 10 000 символов drag выглядит как комиксы, тормозит несказанно.
Есть cacheAsBitmap для таких вещей.
А масштабировать само поле нельзя?
romantique
26.07.2007, 14:55
Текстовое поле? Можно, но масштабирование поля не приводит к масштабированию текста, оно приводит к wordwrap'ам и тому подобным эффектам, которые для меня неприемлемы. Или ты имеешь ввиду что то другое?
romantique
26.07.2007, 14:59
Есть cacheAsBitmap для таких вещей.
Не понимаю, каким образом может помочь cacheAsBitmap для масштабирования текста, если текст должен оставаться текстом, а не становиться картинкой. Как я уже сказал возможность выделения текста (именно как текста, тот обычный select как в notepad'е) - это требование к задаче.
Или я вас не понял...
Текст перемещается или масштабируется? Если масштабируется однократно, а потом перемещается, то cacheAsBitmap должен помочь. При условии, что высота или ширина клипа с текстом не превышает 2880 пикселей.
romantique
26.07.2007, 15:11
Масштабируется однократно, потом только перемещается. Но разве cacheAsBuitmap не сделает его картинкой? Он сможет оставаться selectable ?
romantique
26.07.2007, 15:20
У меня проста flash 7 стоит. Там вапще такого нет. В livedoc'ах адоба пишут, что конвертируется в картинку, откуда логично предполагать, что текст перестанет быть текстом. Думал узнать у того, кто шарит, прежде чем тратить время на установку флэша :/
Текстовое поле? Можно, но масштабирование поля не приводит к масштабированию текста, оно приводит к wordwrap'ам и тому подобным эффектам, которые для меня неприемлемы. Или ты имеешь ввиду что то другое?
Предварительно сделать embed для шрифта
var mc:MovieClip = this.createEmptyMovieClip ("mc", 0);
var txt:TextField = mc.createTextField ("txt", 0, 100, 100, 200, 200);
txt.multiline = true;
txt.wordWrap = true;
txt.embedFonts = true;
txt.text = "123 345678 0 123 345678 0 123 345678 0 123 345678 0 123 345678 0 123 345678 0 ";
setInterval(this, "resize", 10);
function resize () {
mc._width--;
mc._yscale = mc._xscale;
}
У меня проста flash 7 стоит. Там вапще такого нет. В livedoc'ах адоба пишут, что конвертируется в картинку, откуда логично предполагать, что текст перестанет быть текстом. Думал узнать у того, кто шарит, прежде чем тратить время на установку флэша :/
Самое время перейти на восьмерку. Пример во вложении. Нужно открыть swf восьмым плеером и попробовать покликать мышью. Текст нормально выделяется при включенном и выключенном cacheAsBitmap.
romantique
26.07.2007, 15:26
Я уже писал, что embed не приемлен из соображений производительности. Несколько тысяч символов, отрендеренных флэшэм как кривые - не есть быстро. Но всё равно спасибо, это вариант я уже пробовал)
А 10000 символ в любом случаи машину подвесит :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.