Просмотр полной версии : 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 слушатели сбрасывают формат.
Ведь должен же быть какой-то механизм, что-то же там происходит.
Или может быть это функция преобразования числа в строку такое делает.
Исходя из предоставленного вами кода, то получается, что как раз при событии мыши и устанавливается 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.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.