Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MouseEvent и сброс TextFormat (http://www.flasher.ru/forum/showthread.php?t=202681)

Fogflasher 01.08.2013 11:29

MouseEvent и сброс TextFormat
 
Есть небольшой код:

Код AS3:

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

Первое что нужно сделать это
Код AS3:

text1.embedFonts =
text2.embedFonts = true;

и внедрить шрифт Veranda.

Добавлено через 1 минуту
+
Код AS3:

text1.defaultTextFormat = format1;
text2.defaultTextFormat = format2;


Fogflasher 01.08.2013 11:47

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

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

Код AS3:

 
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

Цитата:

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

Потому что шрифт не внедрён в флеш.

Fogflasher 01.08.2013 12:13

AlexCooper, понятно.

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

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

AlexCooper 01.08.2013 12:20

Цитата:

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

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

Добавлено через 3 минуты
Цитата:

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

Fogflasher 02.08.2013 12:09

Цитата:

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

Код AS3:

При внедрении шрифта выбираете диапазоны используемых символов

Для С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/FlashPla...aultTextFormat
А чтобы изначально текст был отформатирован согласно вашего TextFormat, тогда добавьте перед добавлением текстового поля в список отображения.
Код AS3:

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

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

AlexCooper 02.08.2013 13:13

Вложений: 1
Цитата:

Сообщение от Fogflasher (Сообщение 1142559)
Для СS3 этой опции нет, и алгоритм внедрения шрифта немного отличен от описанного по ссылке

как нет? смотрите картинку ниже

Цитата:

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

Fogflasher 02.08.2013 13:59

Вложений: 5
Хм, странно. У меня вот такая версия (портабельная):

Вложение 29877

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

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

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

В коротом пункт Linkage:
Вложение 29876

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


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

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