PDA

Просмотр полной версии : MouseEvent и сброс TextFormat


Fogflasher
01.08.2013, 11:29
Есть небольшой код:

package
{


import flash.display.*;
import flash.text.*;
import flash.events.*;


public class MouseTrigger extends Sprite
{

private var text1:TextField;
private var text2:TextField;

private var format1:TextFormat;
private var format2:TextFormat;

private var clickCounter:uint = 0;
private var overCounter:uint = 0;


public function MouseTrigger()
{
textInit();

mouseInit();

}

private function textInit()
{

//--- MouseClick textfield ---//
text1 = new TextField();
text1.text = "MouseClick";
text1.x = 50;
text1.y = 50;
text1.selectable = false;
text1.autoSize = TextFieldAutoSize.LEFT;

format1 = new TextFormat();
format1.color = 0xCCCC00;
format1.font = "Verdana";
format1.size = 25;
text1.setTextFormat(format1);

addChild(text1);

//--- MouseOver textfield ---//
text2 = new TextField();
text2.text = "MouseOver";
text2.x = 50;
text2.y = 150;
text2.selectable = false;
text2.autoSize = TextFieldAutoSize.LEFT;

format2 = new TextFormat();
format2.color = 0x00CCCC;
format2.font = "Verdana";
format2.size = 25;
text2.setTextFormat(format2);

addChild(text2);

}

private function mouseInit()
{
text1.addEventListener(MouseEvent.CLICK, clickTrigger);

text2.addEventListener(MouseEvent.MOUSE_OVER, overTrigger);

}

private function clickTrigger(e:MouseEvent)
{
clickCounter ++;
text1.text = "MouseClick: triggered " + clickCounter.toString() + " times";

}

private function overTrigger(e:MouseEvent)
{
overCounter ++;
text2.text = "MouseOver: triggered " + overCounter.toString() + " times";


}

}

}

Чисто технически он работает ОК, однако есть один побочный эффект.
После нажатия на текстфилд1 (или после наведения на текстфилд2) его TextFormat почему-то сбрасывается в дефолтный.

Это нормально, или какой-то баг?

Что сделать, чтобы такого не было?
(Хотя, один вариант я вижу: в обработчике события снова запускать функцию setTextFormat(), но такое решение не очень оптимальное, походу дела.)

AlexCooper
01.08.2013, 11:32
Первое что нужно сделать это
text1.embedFonts =
text2.embedFonts = true; и внедрить шрифт Veranda.

Добавлено через 1 минуту
+ text1.defaultTextFormat = format1;
text2.defaultTextFormat = format2;

Fogflasher
01.08.2013, 11:47
AlexCooper, аа, дефолт формат... спасибо, идею понял.
Шрифт наверное все-таки Verdana имелся ввиду.

Ок, переделал код так:



package
{



import flash.display.*;
import flash.text.*;
import flash.events.*;


public class MouseTrigger extends Sprite
{

private var text1:TextField;
private var text2:TextField;

private var format1:TextFormat;
private var format2:TextFormat;

private var clickCounter:uint = 0;
private var overCounter:uint = 0;


public function MouseTrigger()
{
textInit();

mouseInit();

}

private function textInit()
{

//--- MouseClick textfield ---//
format1 = new TextFormat();
format1.color = 0xCCCC00;
format1.font = "Verdana";
format1.size = 25;

text1 = new TextField();
text1.text = "MouseClick";
text1.x = 50;
text1.y = 50;
text1.selectable = false;
// text1.embedFonts = true;
text1.autoSize = TextFieldAutoSize.LEFT;

text1.defaultTextFormat = format1;

addChild(text1);

//--- MouseOver textfield ---//
format2 = new TextFormat();
format2.color = 0x00CCCC;
format2.font = "Verdana";
format2.size = 25;

text2 = new TextField();
text2.text = "MouseOver";
text2.x = 50;
text2.y = 150;
text2.selectable = false;
// text2.embedFonts = true;
text2.autoSize = TextFieldAutoSize.LEFT;

text2.defaultTextFormat = format2;

addChild(text2);

}

private function mouseInit()
{
text1.addEventListener(MouseEvent.CLICK, clickTrigger);

text2.addEventListener(MouseEvent.MOUSE_OVER, overTrigger);

}

private function clickTrigger(e:MouseEvent)
{
clickCounter ++;
text1.text = "MouseClick: triggered " + String(clickCounter) + " times";

}

private function overTrigger(e:MouseEvent)
{
overCounter ++;
text2.text = "MouseOver: triggered " + String(overCounter) + " times";


}

}

}




Строки с embedFonts закаментировал, потому-что, с ними, получается вообще ПУСТОЙ ЭКРАН (почему?)

Однако, и в такой реализации возникает симметрично-противоположный перекос.
Теперь до нажатия кнопок мы имеем стандартный системный формат, и только после нажатия он изменяется в defaultTextFormat.

AlexCooper
01.08.2013, 11:52
Строки с embedFonts закаментировал, потому-что, с ними, почему-то вообще ПУСТОЙ ЭКРАН (почему?)

Потому что шрифт не внедрён (http://edapskov.ru/pages.php?id=61) в флеш.

Fogflasher
01.08.2013, 12:13
AlexCooper, понятно.

Но ведь это весьма избыточный путь, неужели нет более простого решения?

Проще в обработчике еще раз setTextFormat() кастануть, например.

AlexCooper
01.08.2013, 12:20
Но ведь это весьма избыточный путь, неужели нет более простого решения?

О каком избытке идёт речь? При внедрении шрифта выбираете диапазоны используемых символов, в чем избыток? Вы не понимаете зачем нужно внедрять шрифт в плеер? Для того чтобы он правильно отображался. Это все равно что не заправлять машину бензином, потому что она становиться тяжелее и говорить, может как-то я буду просто сзади толкать, так и поедим.

Добавлено через 3 минуты
Проще в обработчике еще раз setTextFormat() кастануть, например.
Я Вам написал как нужно (не говоря уже об программном импорте), хотите делать через Ж, делайте через Ж. Позже все равно придется импортировать шрифт.

Fogflasher
02.08.2013, 12:09
О каком избытке идёт речь?

Имелось ввиду, что (как оказывается), такую задачу нельзя решить чисто кодом AS3.0, без привлечения манипуляций с интерфейсом.

При внедрении шрифта выбираете диапазоны используемых символов
Для СS3 этой опции нет, и алгоритм внедрения шрифта немного отличен от описанного по ссылке.
Но это не принципиально, разумеется. Но акцент на момент задания вопроса, был еще и поэтому.

Вы не понимаете зачем нужно внедрять шрифт в плеер? Для того чтобы он правильно отображался.

Да, я действительно этого не понимал. Мне казалось, что внедрение шрифтов нужно только для случаев сторонних, экзотических шрифтов.
И что системные шрифты типа Verdana будут правильно внедряться автоматически, только на базе кодов для textField и textFormat.

Я Вам написал как нужно (не говоря уже об программном импорте), хотите делать через Ж, делайте через Ж. Позже все равно придется импортировать шрифт.

Если бы я хотел сделать через Ж, то не создавал бы этот пост.
Да, я уже его проимпортировал, теперь всё работает как надо.

( Отмечу, для тех кому это интересно: при внедрении в CS3 нужно указывать не имя шрифта, как, казалось бы в данном случае должно было быть format1.font = new Verdana().fontName; а значение для Field Symbol Properties: Name, которое задается производьно, то есть например в моем случае: format1.font = new Embed1().fontName; )

Осталось, разве что, непонятным, почему MouseEvent слушатели сбрасывают формат.
Ведь должен же быть какой-то механизм, что-то же там происходит.
Или может быть это функция преобразования числа в строку такое делает.

belv
02.08.2013, 12:50
Исходя из предоставленного вами кода, то получается, что как раз при событии мыши и устанавливается defaultTextFormat, который вы определили.
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/text/TextField.html#defaultTextFormat
А чтобы изначально текст был отформатирован согласно вашего TextFormat, тогда добавьте перед добавлением текстового поля в список отображения.

text1.setTextFormat(format1);
addChild(text1);


Шрифт будет все время такой, каким вы его задали в format1.

AlexCooper
02.08.2013, 13:13
Для СS3 этой опции нет, и алгоритм внедрения шрифта немного отличен от описанного по ссылке
как нет? смотрите картинку ниже


( Отмечу, для тех кому это интересно: при внедрении в CS3 нужно указывать не имя шрифта, как, казалось бы в данном случае должно было быть format1.font = new Verdana().fontName; а значение для Field Symbol Properties: Name, которое задается произвольно, то есть например в моем случае: format1.font = new Embed1().fontName; )

Так и должно быть, откуда компилятору знать как называется шрифт, а так вы при внедрении задаете идентификатор к нему и обращаетесь.

Fogflasher
02.08.2013, 13:59
Хм, странно. У меня вот такая версия (портабельная):

29877

И в ней, по опции:
29873

Есть лишь такое меню:
29874

И затем, когда шрифт добавлен, есть еще контекстное меню:
29875

В коротом пункт Linkage:
29876

И это всё что есть.

AlexCooper
02.08.2013, 14:53
Вкладка Properties вместо Linkage

Fogflasher
02.08.2013, 15:00
По Properties выдается окно, которое в предыдущем камменте имеет название Font Symbol Properties.