![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2006
Сообщений: 89
|
Всем доброго времени суток.
Тема это обсуждалась не раз, для АС2 есть например этот тред: http://flasher.ru/forum/showthread.php?t=97958&page=6 НО работает только пример slin тогда как пример __etc определяет не правильно границы... Не тестировал код на разных шрифтак, просто хотелось бы понять какое решение работает всегда чтобы его впредь использовать... Код: import com.davydden.MyUtils;
var tf = this.createTextField("tf", 1, 0, 0, 150, 10);
trace(tf._width);
tf.autoSize="left";
tf.multiline=true;
tf.wordWrap=true
tf.condenseWhite=true;
tf.html= true;
tf.htmlText="<p align='center'>Я умею делать задник.<br/>Я люблю ActionScritpt.<br/>Просто я извращенец :)</p>";
var rect=MyUtils.getTextBounds(tf);
with (this) {
beginFill(0xFF0000, 50);
moveTo(tf._x+rect.x,tf._y+rect.y);
lineTo(tf._x+rect.x+rect.width,tf._y+rect.y);
lineTo(tf._x+rect.x+rect.width,tf._y+rect.y+rect.height);
lineTo(tf._x+rect.x,tf._y+rect.y+rect.height);
endFill();
}
trace(rect);
var rect=MyUtils.getSize(tf);
with (this) {
beginFill(0xFFF000, 50);
moveTo(tf._x+rect.x,tf._y+rect.y);
lineTo(tf._x+rect.x+rect.width,tf._y+rect.y);
lineTo(tf._x+rect.x+rect.width,tf._y+rect.y+rect.height);
lineTo(tf._x+rect.x,tf._y+rect.y+rect.height);
endFill();
}
trace(rec2);
trace(tf._width);
trace(tf.textWidth);
tf.x=Math.floor((Stage.width-tf.width)/2);
tf.y=Math.floor((Stage.height-tf.height)/2);
class com.davydden.MyUtils {
static function getTextBounds(txt):Object {
var mc = txt._parent.createEmptyMovieClip('__textBounds_mc',-3288);
var t = mc.createTextField('txt',0,0,0,100,100);
t.setNewTextFormat(txt.getTextFormat());
for (var prop in txt) {
t[prop]=txt[prop];
}
t._width = txt._width;
t._height = txt._height;
txt = t;
var xs = txt._xscale;
var ys = txt._yscale;
var scale = 20;
var maxXScale = 2800/txt._width;
var maxYScale = 2800/txt._height;
if (maxXScale < scale) {
scale = maxXScale;
}
if (maxYScale < scale) {
scale = maxYScale;
}
txt._xscale = xs*scale;
txt._yscale = ys*scale;
var bmp = new BitmapData(mc._width,mc._height,true,0);
bmp.draw(mc);
bmp.colorTransform(bmp.rectangle,new ColorTransform(1,1,1,1,0,0,0,255));
var rect = bmp.getColorBoundsRect(0xFF000000,0x00000000, false);
bmp.fillRect(rect,0x80FFFF00);
rect.x /= scale;
rect.y /= scale;
rect.width /= scale;
rect.height /= scale;
txt._xscale = xs;
txt._yscale = ys;
bmp.dispose();
mc.swapDepths(6550);
mc.removeMovieClip();
return rect;
}
static function getSize(txt:TextField):Rectangle {
var bmp:BitmapData = new BitmapData (Math.ceil (txt._width), Math.ceil (txt._height), true, 0);
bmp.draw (txt);
return bmp.getColorBoundsRect(0xFF000000, 0x00000000,false);
}
}
Денис. EDIT: если поставить tf.embedFonts = true; то тогда даже вариант silin'а НЕ РАБОТАЕТ! а на практике именно для такого варианта мне и надо посчитать... в общем, танцы с бубманим, блин.... EDIT2: подкорректировал код __etc (обозначено желтым) и все заработало. Буду проверять на других шрифтак, если будут проблеммы с этим кодом - напишу... EDIT3: все это делал чтобы подогнать размер TextField под текст в случаях когда изначально TextField слишком большой для текста... Оказывается если ставить ему ширину/высоту полученную указаным выше способом, то текст либо обрезается либо появляется новая линия если стоит мультилайн... В общем, не понятно.... Последний раз редактировалось Denis Davidov; 29.07.2008 в 13:21. |
![]() |
Часовой пояс GMT +4, время: 10:16. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|