Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TextField: размещение в центр Stage. (http://www.flasher.ru/forum/showthread.php?t=202455)

Fogflasher 17.07.2013 15:24

TextField: размещение в центр Stage.
 
Всем лукошечко с черникой.

Еще один базовый вопрос.
Необходимо разместить TextField в самый центр Stage, с учетом того, что его длина может быть произвольной.

Как это сделать?

Я через поиск посмотрел, но навскидку конкретного поста не увидел.
В близком по смыслу посту, in4core предлагал формулу центровки для мувиклипа, с учетом длины и ширины.

По этой аналогии, я предположил, что со стэйджем должно быть примерно так:

Код AS3:

text1.x = (stage.width - text1.width) * 0.5;
text1.y = (stage.height - text1.height) * 0.5;

Однако при запуске текстфилд "уплыл" куда-то в верхний левый угол.
Я решил посчитать, что же произошло.

Stage.width = 640, Stage.height = 480
text1.width = 124, text.height = 80

Итого, по формуле получаем:
text1.x = 258, text1.y = 200.

Если на глаз прикинуть, то вроде бы это верные координаты.
Но только, если x и y TextField размещаются в левом верхнем углу.
Но судя по всему это не так, и наверное на самом деле они отмечают центр TextField?

В хэлпе Адоуб вроде бы не сказано откуда именно отсчитывать x и y TextField.

caseyryan 17.07.2013 15:37

У stage есть свойства stageWidth и stageHeight.
Вот их и надо использовать
Код AS3:

var tf:TextField = new TextField();
tf.width = 200;
tf.height = 20;
tf.background = true;
tf.text = "проверка";
tf.x = (stage.stageWidth - tf.width) / 2;
tf.y = (stage.stageHeight - tf.height) / 2;
addChild(tf);


Fogflasher 17.07.2013 17:48

Вложений: 1
caseyryan, да, stageWidth, блин точно, спасибо.

Однако в таком варианте имеется перекос:
теперь x и y текстфилда вроде бы находятся в центре...
Но тогда получается так:

Вложение 29828

В формулу нужна поправка похоже.
Может быть еще влияют другие параметры?

Например есть:

textFormat'овское свойство:
- align = TextFormatAlign.LEFT;

textField'овские свойства:
- autoSize = TextFieldAutoSize.LEFT;
- multiline = true;
- wordWrap = false;

Deimos747 17.07.2013 18:25

Текст присваивается до или после центрирования?

Fogflasher 18.07.2013 09:21

Deimos747, До.

Сейчас вот сделал - после. Он еще ниже в правый угол ушел, лол.

Странно, почему это влияет..? Значит надо играцца с всякими алигнами, наверное.

UPD: Переместил строки:
Код AS3:

text1.setTextFormat(format1);
text1.filters = filter1.filtersArray;

... до присвоения координат. И всё получилось.

KumoKairo 18.07.2013 09:36

По-моему если поставить autoSize в TextFieldAutoSize.CENTER; и поправлять координаты после каждого изменения текста, то должно быть норм

Оффтопик: у вас растровый шрифт? Не поделитесь своим способом реализации на нативном флеше?

Fogflasher 18.07.2013 11:47

KumoKairo, странно дело, если TextFieldAutoSize.CENTER поставить, и переместить форматирование обратно (в докоординатное положение), то текст центрируется по ширине правильно, но смещен в нижний угол.

Насчет шрифта, это Rokwell Extra Bold, OpenType-овский шрифт.
Я не знаю что означает "растровый" в применении к шрифтам?

Способ реализации прост: основной файл (координаты + текст) + класс текста (базовые настройки) + класс формата (там только цвет и имя шрифта) + класс фильтров (настройки фильтров).

Если нужен код класса фильтров, могу запостить его здесь.

KumoKairo 18.07.2013 12:01

А, ясно
Нет, я думал у вас BitmapFont из спрайт листа, спасибо :)

Fogflasher 18.07.2013 12:16

KumoKairo, да незачто.

Ээ, а что такое "BitmapFont из спрайт листа" ?
Можно хотя бы в паре слов, что это - техника вывода текста, юзая чисто графику?
Было бы полезно, если я это себе правильно представляю. Типа не юзать шрифты, не внедрять их.

KumoKairo 18.07.2013 19:49

Вложений: 1
BitmapFont это набор всевозможных требуемых приложением символов, которые заранее отрисованы с применением необходимых стилей, фильтров и т.д., собранных в виде одного изображения (которое по идее отправляется в виде текстуры на графическую карту)
Поскольку мобильные приложения с векторной графикой не очень дружат, для мобильников этот процесс отлажен просто до упора :)
Вот например:
Вложение 29829
У меня просто недавно возникла необходимость добавить текстовое поле с готовым шрифтом, а безбиблиотечной реализации (я "фанат" старлинга и там это есть) не оказалось. А то что нашел было слишком масштабным. В итоге пришлось делать свою реализацию отрисовки, но она не гибкая, расчитанная только "на один раз", поэтому стало интересно узнать насчет вашего способа отрисовки текста

Fogflasher 19.07.2013 14:16

KumoKairo, Хм, прикольно. То есть - это единое изображение, но благодаря некоторому алгоритму, из него можно брать нужные буквы-фрагменты и формировать из временного массива текст. Если я всё правильно понимаю.

У меня была похожая идея, но делать не алфавит, а просто заготовить надписи в фотошопе, и в виде картинок их помещать на стэйдж. Она появилась потому что тема внедрения шрифтов весьма муторная.

teddi.men 19.07.2013 14:35

Согласен с caseyryan, плюс кое-что добавил
Код AS3:

import flash.display.StageAlign;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
 
stage.align = StageAlign.TOP_LEFT;
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
tf.background = true;
tf.text = "проверка";
tf.x = (stage.stageWidth - tf.width) / 2;
tf.y = (stage.stageHeight - tf.height) / 2;
addChild(tf)


KumoKairo 19.07.2013 15:09

Fogflasher, у каждого шрифта есть файл-спрайт лист и файл дескриптор в формате XML (расширение .fnt)
http://www.angelcode.com/products/bmfont/

Fogflasher 22.07.2013 09:11

KumoKairo, зачотно, узнаю много нового.

Скачал бмп-фонт, посмотрел. В целом вроде бы идея понятна. Формируется картинка, и посредством кода, который я должен написать сам, я буду вытаскивать нужный фрагмент картинки, опираясь на xml-файл. Но конешно такую программу навскидку не напишешь, тут нужно перечитывать мука про xml, например.

Старлинг тоже скачал. Открыл, но там... хренова туча непонятных файлов, как-будто для Линукса каково-нибудь. Как с ним работать и как внедрять во Флэш например, не понятно нихрена : ) Хотя в форуме или в документациях еще не искал ничего. Вроде бы это всё как-то связано с неким Stage3D, кое слово мне тоже тут встречалось.

Frost47rus 24.07.2013 01:25

Код AS3:

textField.autoSize = TextFieldAutoSize.LEFT;
textField.text = 'lorem ipsum';
textField.x = (stage.stageWidth - textField.textWidth) / 2;

и должно быть все ок.


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

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