Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Точный размер текста в текстфилде (http://www.flasher.ru/forum/showthread.php?t=111099)

alekslitvinenk 16.04.2008 00:08

Точный размер текста в текстфилде
 
Неожиданно столкнулся с проблемой, когда textWidth и textHeight текстового поля возвращают недостоверные результаты. Для одних шрифтов погрешности почти нет, а для других она весьма значительна. С погрешностью textWidth я уже почти смрился, но вот узнать точный размер textHeight хоть убейте - надо...
Использование LineMetrics тоже к получению достоверных данных не привели.
Есть ли у кого-нибудь идея как получить более менее правдивые данные о textHeight ?

Pecher 16.04.2008 10:10

Если совсем ниче не поможет, а скорость не очень важна - переводи текст на BitmapData и ищи снизу первую строку, где есть хоть одна точка :)

alekslitvinenk 16.04.2008 10:22

Спасибо за совет.
Но дело в том, что скорость как раз-таки и важна, так как все это должно висеть на Event.CHANGE...

etc 16.04.2008 10:53

Размер глифов или все таки текста с полями?

alekslitvinenk 16.04.2008 11:05

Вобщем, есть текстовое поле его должна окружать рамка с маркерами для ресайзинга...
Проблема в том, что я не могу точно посчитать высоту рамки каждый раз когда добавляеться/удаляется новая строка текста...

Pecher 16.04.2008 13:18

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

P.S. Можно ещё поставить
Код:

autosize = true
для многострочного текстового поля. Тогда, наверное, будет браться height.

ulik 16.04.2008 13:18

alekslitvinenk >> а так чем вам не нравится?

Код:

import flash.text.TextFormat;
import flash.text.TextField;
import flash.display.Sprite;
import flash.geom.Rectangle;

var format:TextFormat=new TextFormat();
format.font="любой_шрифт";
format.size=20;

var tf:TextField=new TextField();
tf.defaultTextFormat=format;
tf.autoSize=TextFieldAutoSize.LEFT;
tf.htmlText="Hello world!";
addChild(tf);

var bound:Rectangle = tf.getCharBoundaries(0); // скажем, для 1-ой
var sp:Sprite=new Sprite();
sp.graphics.lineStyle(1,0xdd0000);
sp.graphics.moveTo(bound.x, bound.y);
sp.graphics.lineTo(bound.x+bound.width,bound.y);
sp.graphics.lineTo(bound.x+bound.width,bound.y+bound.height);
sp.graphics.lineTo(bound.x,bound.y+bound.height);
sp.graphics.lineTo(bound.x, bound.y);
addChild(sp);

Цитата:

Вобщем, есть текстовое поле его должна окружать рамка с маркерами для ресайзинга...
О: А, чем вас не устраивает TextFieldAutoSize?
Цитата:

...переводи текст на BitmapData...
О: Психи, ей богу :)))

Pecher 16.04.2008 13:29

Цитата:

Психи, ей богу ))
Ты наверно не прочитал, что это предложение - на крайний случай. Глаза раскрой.

alekslitvinenk 16.04.2008 13:31

Цитата:

О: А, чем вас не устраивает TextFieldAutoSize?
Это не я так решил, это заказчику нужна возможность ресайзить текстовое поле с помощью маркеров...Причем, там куча ограничений: когда текстовое поле должно автоматически расти по ширине, а когда нет...
Если выставить autoSize, то слишком много вещей окажется сломано...

etc 16.04.2008 13:41

Цитата:

Сообщение от Pecher
Глаза раскрой.

Не переходите на личности.

ulik 16.04.2008 13:44

Цитата:

Ты наверно не прочитал, что это предложение - на крайний случай. Глаза раскрой.
О: глаза на месте. Даже на крайний случай - не стоит этого делать. Зачем делать из велосипеда болид формулы?

alekslitvinenk >> если я правильно вас понял, то вам нужен текстфилд, который можно сайзить в двух плоскостях (w/h), так ?
Ну, тогда попробуйте брать баунды первой буквы каждой строки.

alekslitvinenk 16.04.2008 15:30

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

Попробую описать проблему несколько иначе:
Как правильно задать высоту текстовому полю, чтобы текст был виден целиком, чтобы даже ничтожная часть символов не скрывалась(а именно так и происходит если использовать
Код:

_myTextField.height = _myTextFiled.textHeight
) ?

В настоящее время использую:

Код:

_myTextField.height = _myTextFiled.textHeight + 4*_myTextFiled.numLines
Но такой способ приращения оказывается слишком избыточным, особенно если сток много, в то же время
Код:

3*_myTextFiled.numLines
может оказаться недостаточно, если строк мало, а шрифт экзотический(например Blades)...
Да, и к размеру шрифта это никакого отношения не имеет.

ulik 16.04.2008 15:37

Да, вроде все номально с autoSize.
Код:

var recordHeight:int=0;

var fo:TextFormat=new TextFormat();
fo.font="любой";
fo.size=26;

var tf:TextField=new TextField();
tf.type=TextFieldType.DYNAMIC;
tf.multiline=true;
tf.wordWrap=true;
tf.condenseWhite=true;
tf.defaultTextFormat=fo;
tf.border=true;
tf.htmlText="Hello world!<br/>Hello world!<br/>Hello world!";
tf.width=150; //для примера
tf.autoSize=TextFieldAutoSize.LEFT; // включили, отсайзили под размер
recordHeight=tf.height; //записали
tf.autoSize=TextFieldAutoSize.NONE; //выключили
tf.height=int(recordHeight); // округлили, подогнали
addChild(tf);


ElLamok 18.04.2008 21:26

Ну а теперь сделайте TextFormat с италиком и шрифтом, например, таймс, передайте туда "f" и увидите, что буква у вас обрезается....
Можно полечить форматированием, например, rightMargin, но, имхо, все равно это плохой хак

silin 19.04.2008 00:13

Код:

function getTextRect(tf:TextField):Rectangle {
       
        var tmpBmp:BitmapData = new BitmapData(tf.width, tf.height, true, 0x00000000);
        tmpBmp.draw(tf);
        var result:Rectangle = tmpBmp.getColorBoundsRect(0xFFFFFFFF, 0x00000000, false);
        tmpBmp.dispose();
       
        return result;
}


etc 19.04.2008 05:57

http://flasher.ru/forum/showthread.php?t=97958&page=6

romantique 02.08.2008 14:29

Простите что не вовремя. Попробуйте:
Код:

txtField.width = txtField.textWidth + 4;
txtField.height = txtField.tetxHeight + 4;

Кажется по 2 пикселя с каждой стороны - это нечто данное свыше и всюду постоянное... тестировал на размерах шрифтов от 1 до не помню, 20 с лишним... Всё идеально было!

s8000_1 03.08.2008 14:24

romantique, для ширины - для разных шрифтов надо разную циферку прибавлять. Точно знаю что для Tahoma - +3.

romantique 03.08.2008 15:52

Ух ты, не знал даже. А есть где нть табличка этих циферок?:) Честно говоря немало неудобств эта штука доставила тем, кому нужно масштабировать что то пиксель в пиксель.

etc 03.08.2008 17:53

Цитата:

Сообщение от romantique (Сообщение 756052)
Ух ты, не знал даже. А есть где нть табличка этих циферок?:) Честно говоря немало неудобств эта штука доставила тем, кому нужно масштабировать что то пиксель в пиксель.

А выше код и ссылки посмотреть лень?

romantique 03.08.2008 21:49

Не лень. Код выше и ссылки не дают ответа на мой вопрос.
В AS2 точно помню, что было именно по 2-пиксельная рамка, помимо всех прочих параметризуемых отступов и т.п. Это не зависело от шрифта.

картинка из хэлпа:
http://livedocs.adobe.com/livecycle/...xt-metrics.jpg

etc 03.08.2008 21:54

Была и есть, но вот только шрифты разные бывают.

romantique 03.08.2008 22:15

Цитата:

Сообщение от s8000_1 (Сообщение 756045)
romantique, для ширины - для разных шрифтов надо разную циферку прибавлять. Точно знаю что для Tahoma - +3.

Не правда. Щас проверил с троечкой, текст прыгает ровно на 1 пиксель.

Цитата:

Сообщение от __etc (Сообщение 756092)
Была и есть, но вот только шрифты разные бывают.

Простите, не вижу противоречий. Почему взятие textWidth и textHeight с прибавленной четвёркой не решает проблемы, не понимаю. Как я понимаю, это параметры пересчитываются с учётом формата и текстового содержимого; во внимание не берётся этот так называемый 2-pixel gutter.


Часовой пояс GMT +4, время: 09:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.