Форум 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=111387)

codecast 24.04.2008 10:26

отцентрировать текст относительно мувика
 
хочу сделать что-то типа хинта. Всплывает такое облачко и в нем должен быть текст. Текстовое поле создается программно.
Код:

...
txt = new TextField ();
addChild (txt);
txt.wordWrap=true; txt.selectable=false;
txt.embedFonts=true;
txt.htmlText=str;
//центрируем
txt.x=(cloud.width-txt.textWidth)/2;
txt.y=(cloud.height-txt.textHeight)/2;
...

текст отображается, но отцентрирован неправильно совершенно. поля textWidth, textHeight, а также width, height, а так же функция getBounds выдают совершенно неправельный результат. Как исправить?

etc 24.04.2008 10:38

autoSize

codecast 24.04.2008 11:00

мм...
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;
}

и ваше решение для AS2 тоже:
Код:

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();

такие адские шаманства с бубном надо класть в faq!

Mr. Fixit 24.04.2008 12:19

Цитата:

...такие адские шаманства с бубном...
или писать правильно код. :)

ulik 24.04.2008 12:32

codecast, а вы изврещенец...
можно было использовать просто tf.width...

etc 24.04.2008 12:43

Цитата:

Сообщение от codecast (Сообщение 735164)
мм...
autoSize не катит, так как необходимо еще центрирование по высоте.
Но я уже нашел решение silin'а:

и ваше решение для AS2 тоже:
такие адские шаманства с бубном надо класть в faq!

Для AS1 вариант намного точнее :)

codecast 24.04.2008 12:54

2fixit, 2ulik:
ну расскажите тогда, как правильно по вашему программно создать текстовое поле, заполнить произвольным текстом и добавить задник, точно по его размерам.
2_etc:
я чесно as1 вариант не понимаю, поэтому немогу оченить точнее он или нет =/ а силина варинт мне понятен, и гм... какие могут быть неточности в нем, если он возвращает координаты бокса в котором вписаны абсолютно все пиксели?
Это в вашем варианте, кстати, запятые не влязят внутри бокса.

etc 24.04.2008 13:08

Вариант silin-а точен с точностью до пикселя, мой — до 0,05.
Насчет запятых не проверял.

ulik 24.04.2008 13:08

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);

ps: etc глянь лс

codecast 24.04.2008 13:35

2ulik:
чесно, я фигею.
твой код работает. он правда ошибся по вертикали на 2px, но он работает. а мой код возвращал мне совершенную фигню в трейсах высоты и ширины.
мда... а вся разница в выставленом autoSize, о чем мне любезно намекнул _etc, а намек-то я его не понял.
Короче все работает если есть autoSize, а меня смутил вот этот топик http://www.flasher.ru/forum/showthre...E8%F0%E8%ED%E0


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

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