![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Banned
Регистрация: Mar 2008
Сообщений: 24
|
хочу сделать что-то типа хинта. Всплывает такое облачко и в нем должен быть текст. Текстовое поле создается программно.
текст отображается, но отцентрирован неправильно совершенно. поля textWidth, textHeight, а также width, height, а так же функция getBounds выдают совершенно неправельный результат. Как исправить? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
autoSize
|
|
|||||
|
Banned
Регистрация: Mar 2008
Сообщений: 24
|
мм...
autoSize не катит, так как необходимо еще центрирование по высоте. Но я уже нашел решение silin'а: 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;
}
import flash.geom.*;
import flash.display.BitmapData;
getTextBounds = function(txt) {
var mc = txt._parent.createEmptyMovieClip('__textBounds_mc',-3288);
var t = mc.createTextField('txt',0,0,0,100,100);
t.setNewTextFormat(txt.getTextFormat());
t.embedFonts = txt.embedFonts;
t.html = txt.html;
t.htmlText = txt.htmlText;
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;
}
rect = getTextBounds(txt);
beginFill(0xFF0000, 30);
moveTo(txt._x+rect.x,txt._y+rect.y);
lineTo(txt._x+rect.x+rect.width,txt._y+rect.y);
lineTo(txt._x+rect.x+rect.width,txt._y+rect.y+rect.height);
lineTo(txt._x+rect.x,txt._y+rect.y+rect.height);
endFill();
|
|
|||||
|
Banned
[+1 08.05.08]
[+4 14.04.08] [+1.3 02.05.08] Регистрация: Oct 2006
Адрес: кагбэ Киеф!!1
Сообщений: 1,473
|
Цитата:
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
![]() |
|
|||||
|
Banned
Регистрация: Mar 2008
Сообщений: 24
|
2fixit, 2ulik:
ну расскажите тогда, как правильно по вашему программно создать текстовое поле, заполнить произвольным текстом и добавить задник, точно по его размерам. 2_etc: я чесно as1 вариант не понимаю, поэтому немогу оченить точнее он или нет =/ а силина варинт мне понятен, и гм... какие могут быть неточности в нем, если он возвращает координаты бокса в котором вписаны абсолютно все пиксели? Это в вашем варианте, кстати, запятые не влязят внутри бокса. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Вариант silin-а точен с точностью до пикселя, мой — до 0,05.
Насчет запятых не проверял. |
|
|||||
|
2codecast: может я что-то не понимаю, но что вас не устраивает?!?!? Зачем мастерить из велосипеда ракету класса "земля-воздух" ???
var tf:TextField=new TextField(); tf.width=125; tf.autoSize=TextFieldAutoSize.LEFT; tf.multiline=true; tf.wordWrap=true tf.condenseWhite=true; tf.htmlText="Я умею делать задник.<br/>Я люблю ActionScritpt.<br/>Просто я извращенец :)"; tf.x=int((stage.stageWidth-tf.width)/2); tf.y=int((stage.stageHeight-tf.height)/2); addChild(tf); var sp:Sprite=new Sprite(); sp.graphics.lineStyle(1,0xFFFFCC); sp.graphics.beginFill(0xFFFFCC); sp.graphics.moveTo(0,0); sp.graphics.lineTo(tf.width,0); sp.graphics.lineTo(tf.width,tf.height); sp.graphics.lineTo(0,tf.height); sp.graphics.lineTo(0,0); sp.graphics.endFill(); sp.x=tf.x; sp.y=tf.y; addChildAt(sp,0); Последний раз редактировалось ulik; 24.04.2008 в 13:23. |
|
|||||
|
Banned
Регистрация: Mar 2008
Сообщений: 24
|
2ulik:
чесно, я фигею. твой код работает. он правда ошибся по вертикали на 2px, но он работает. а мой код возвращал мне совершенную фигню в трейсах высоты и ширины. мда... а вся разница в выставленом autoSize, о чем мне любезно намекнул _etc, а намек-то я его не понял. Короче все работает если есть autoSize, а меня смутил вот этот топик http://www.flasher.ru/forum/showthre...E8%F0%E8%ED%E0 |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:34. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|