Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.04.2008, 10:26
codecast вне форума Посмотреть профиль Найти все сообщения от codecast
  № 1  
Ответить с цитированием
codecast
Banned

Регистрация: Mar 2008
Сообщений: 24
По умолчанию отцентрировать текст относительно мувика

хочу сделать что-то типа хинта. Всплывает такое облачко и в нем должен быть текст. Текстовое поле создается программно.
Код:
...
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 выдают совершенно неправельный результат. Как исправить?

Старый 24.04.2008, 10:38
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
autoSize

Старый 24.04.2008, 11:00
codecast вне форума Посмотреть профиль Найти все сообщения от codecast
  № 3  
Ответить с цитированием
codecast
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;
}
и ваше решение для 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!

Старый 24.04.2008, 12:19
Mr. Fixit вне форума Посмотреть профиль Найти все сообщения от Mr. Fixit
  № 4  
Ответить с цитированием
Mr. Fixit
Banned
[+1 08.05.08]
[+4 14.04.08]
[+1.3 02.05.08]

Регистрация: Oct 2006
Адрес: кагбэ Киеф!!1
Сообщений: 1,473
Цитата:
...такие адские шаманства с бубном...
или писать правильно код.

Старый 24.04.2008, 12:32
ulik вне форума Посмотреть профиль Отправить личное сообщение для ulik Посетить домашнюю страницу ulik Найти все сообщения от ulik
  № 5  
Ответить с цитированием
ulik
 
Аватар для ulik

Регистрация: Apr 2007
Адрес: Moscow city
Сообщений: 286
Отправить сообщение для ulik с помощью ICQ
codecast, а вы изврещенец...
можно было использовать просто tf.width...
__________________
Дизайн, как презерватив - каждому жмет по-своему © Я
мое: блог форум

Старый 24.04.2008, 12:43
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от codecast Посмотреть сообщение
мм...
autoSize не катит, так как необходимо еще центрирование по высоте.
Но я уже нашел решение silin'а:

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

Старый 24.04.2008, 12:54
codecast вне форума Посмотреть профиль Найти все сообщения от codecast
  № 7  
Ответить с цитированием
codecast
Banned

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

Старый 24.04.2008, 13:08
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Вариант silin-а точен с точностью до пикселя, мой — до 0,05.
Насчет запятых не проверял.

Старый 24.04.2008, 13:08
ulik вне форума Посмотреть профиль Отправить личное сообщение для ulik Посетить домашнюю страницу ulik Найти все сообщения от ulik
  № 9  
Ответить с цитированием
ulik
 
Аватар для ulik

Регистрация: Apr 2007
Адрес: Moscow city
Сообщений: 286
Отправить сообщение для ulik с помощью ICQ
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 глянь лс
__________________
Дизайн, как презерватив - каждому жмет по-своему © Я
мое: блог форум


Последний раз редактировалось ulik; 24.04.2008 в 13:23.
Старый 24.04.2008, 13:35
codecast вне форума Посмотреть профиль Найти все сообщения от codecast
  № 10  
Ответить с цитированием
codecast
Banned

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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