Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание инфо-панели для MOUSE_OVER (http://www.flasher.ru/forum/showthread.php?t=203654)

KumoKairo 03.10.2013 14:29

Цитата:

Вот если бы ТС хотел не по наведению, а по клику получать текст, как тогда, вешать на все обьекты слушателей down?
У меня иногда возникает чувство, что форум это не место обмена опытом а пошаговая инструкция по применению.. Неужели нет возможности проследить похожесть и различие контекста применения подходов? Вчера говорили про добавление слушателя на стейдж для обработки каждой кнопки по-своему. Сегодня говорят про слушателя на стейдже для одинаковой обработки всех кнопок. Я просто не понимаю как можно не отличить подобный контекст применения подходов.

Akopalipsis 03.10.2013 14:34

Цитата:

я хотел сказать, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Цитата:

Я воспринимаю это так - "Я не могу добавить на стейдж объект, поэтому лучше добавлю туда слушатель."
Пример про кнопки я привел потом, но там были не только кнопки
Цитата:

Или если нужно вообще весь экран отслеживать на клик? Вот вообще весь, то так всё равно нельзя?

AlexCooper 03.10.2013 14:38

Akopalipsis, понимаете писать можно в кадрах, китайскими иероглифами с использованием глобальных перемененных. Всё конечно же зависит от задачи которая ложиться на разработчика, нельзя взять и сказать вот это универсальное решение на все случаи жизни. В своей практике я стараюсь использовать объект stage как только возможно редко, можно сказать вообще единожды, при инициализации приложений и основываясь на правиле - Можно использовать DO/DOC вместо stage используем и только тогда когда без этого не обойтись - используем stage. ( Как пример события ввода из клавиатуры )

Akopalipsis 03.10.2013 14:38

Цитата:

Сегодня говорят про слушателя на стейдже для одинаковой обработки всех кнопок.
А что будет если завтра ТС захочет выводить для одних обьектов строки, а для других значения ( числа ).
То все рано ответ будут тот же. Вешать слушателя на стейдж, а там по интерфейсу делить по типам.
И так и получится, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.

KumoKairo 03.10.2013 14:39

Ваши вопросы и утверждения изначально неправильные, я именно это отметил.
Нельзя сказать "вешать слушателей более приемлемо, чем добавлять на неё обьекты" - это две совершенно разные, не связанные друг с другом операции. Я перефразировал чтобы вы сами в этом убедились, и потом сказали мне, что
Цитата:

Этими словами Вы приравняли добавить на стейдж обьект с добавить на стейдж слушатель.
Приравняли добавление объекта на стейдж и добавление слушателя на стейдж именно вы, и именно это я подчеркнул в своем сообщении.

Цитата:

И так и получится, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Вы реально не можете понять или троллите?)
Это две совершенно разные операции, из них нельзя выбрать более приемлимую и менее премлимую) Вы можете и добавить объект на стейдж и добавить слушатель на стейдж, и программа будет работать. От того, что вы добавите объект непосредственно на stage ничего принципиально не изменится.

AlexCooper 03.10.2013 14:47

Цитата:

Сообщение от KumoKairo (Сообщение 1147550)
От того, что вы добавите объект непосредственно на stage ничего принципиально не изменится.

Кроме регресса профессиональных качеств)

Akopalipsis 03.10.2013 14:54

Цитата:

Вы реально не можете понять или троллите?)
я останавливаюсь признав, что это все же разные - несравнимые вещи.
И извиняюсь за настырность, самому не приятно!

Wolsh 03.10.2013 15:47

Да бывает. Иногда так хочется услышать четкий ответ от доверяемого источника, что сам перестаешь думать вообще.

Fogflasher 04.10.2013 00:58

Вложений: 1
KumoKairo, Похоже, я нашел способ как проще применить вашу идею, без введения Sprite субкласса, используя только свойство .name объектов. Хотя, он наверное более избыточен, но как именно применить ваш способ к группе экземпляров разных классов, я не сообразил.

AlexCooper, к сожалению, мое понимание того, что такое интерфейсы и как они работают, еще не превышает наверное и 10% от полного.
Поэтому, я не знаю как адаптировать вашу идею к данному примеру.

Короче говоря, получилось так. Основной документ класс:

Код AS3:

package
{
 
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
 
 
        public class Main extends Sprite
        {
 
 
                //--- Экземпляр класса инфо-панели ---//
                private var _panelPlacer:Panel_placer;
 
                //--- Экземпляр класса добавляемых объектов ---//
                private var _objectPlacer:Object_placer;
 
                public function Main()
                {
 
                        _objectPlacer = new Object_placer();
                        addChild(_objectPlacer);
 
                        _panelPlacer = new Panel_placer();
                        addChild(_panelPlacer);
 
                        //--- Вешаем слушатели на стэйдж ---//
                        stage.addEventListener(MouseEvent.MOUSE_OVER, showInfo);
                        stage.addEventListener(MouseEvent.MOUSE_OUT, resetInfo);
 
                }
 
                private function showInfo(e:MouseEvent)
                {
 
 
                                trace("Класс: ", String(e.target), "; Экземпляр = ", String(e.target.name));
 
                                switch(String(e.target))
                                {
                                        case "[object TextField]" :
 
                                                if(String(e.target.name) == "info_texter")
                                                {
                                                        _panelPlacer._infoPanel.info_texter.text = "Инфо-область";
                                                }
                                                else
                                                {
                                                        _panelPlacer._infoPanel.info_texter.text = "Текст: " + String(e.target.name);
                                                }
                                                break;
 
                                        case "[object Sprite]" :
                                                _panelPlacer._infoPanel.info_texter.text = "Квадрат: " + String(e.target.name);
                                                break;                                       
 
                                        case "[object Info_panel]" :
                                                _panelPlacer._infoPanel.info_texter.text = "Панель: " + String(e.target.name);
                                                break;
 
                                        case "[object Circle]" :
                                                _panelPlacer._infoPanel.info_texter.text = "Эллипс: " + String(e.target.name);
                                                break;
 
                                        case "[object Object_placer]" :
                                                _panelPlacer._infoPanel.info_texter.text = "Шэйп: " + String(e.target.name) + " без спрайта";
                                                break;
 
                                }
 
 
                }
 
                private function resetInfo(e:MouseEvent)
                {
                                _panelPlacer._infoPanel.info_texter.text = "...";
                }
 
 
 
 
        }
 
 
 
}

Ну и класс, который размещает все объекты, кроме панели, такой:
Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
 
        public class Object_placer extends Sprite
        {
 
                public var _objectPlacer:Object_placer;
 
                //--- Произвольные объекты на экране ---//
                private var _someTextfield:TextField;
                private var _someSquare:Shape;
                private var _someTriangle:Shape;
                private var _shapeSprite:Sprite;
                private var _someCircle:Circle;
 
                public function Object_placer()
                {
 
 
                        //--- Размещаем текстфилд ---//
                        _someTextfield = new TextField();
                        _someTextfield.text = "<<< НАВЕДИ КУРСОР НА ОБЪЕКТ >>>";
                        _someTextfield.autoSize = TextFieldAutoSize.LEFT;
                        _someTextfield.background = true, _someTextfield.backgroundColor = 0xFFCC00;
                        _someTextfield.border = true, _someTextfield.borderColor = 0xFF9900;
                        _someTextfield.x = 200, _someTextfield.y = 50;
                        _someTextfield.name = "гласящий " + _someTextfield.text;
                        addChild(_someTextfield);
 
                        //--- Размещаем спрайт квадрата ---//
                        _someSquare = new Shape();
                        _shapeSprite = new Sprite();
                        _shapeSprite.x = 280, _shapeSprite.y = 200;
                        _someSquare.graphics.lineStyle(1);
                        _someSquare.graphics.beginFill(0x00CCFF, 1);
                        _someSquare.graphics.drawRect(0, 0, 75, 50);
                        _shapeSprite.addChild(_someSquare);
                        _shapeSprite.name = "Голубой такой";
                        addChild(_shapeSprite);
 
                        //--- Размещаем шейп треугольника ---//
                        _someTriangle = new Shape( );
                        _someTriangle.graphics.lineStyle(1);
                        _someTriangle.graphics.moveTo(100, 200);
                        _someTriangle.graphics.beginFill(0xFF00CC, 1);
                        _someTriangle.graphics.lineTo(200, 200);       
                        _someTriangle.graphics.lineTo(150, 250); 
                        _someTriangle.graphics.lineTo(100, 200); 
                        _someTriangle.graphics.endFill( );
                        _someTriangle.name = "Фиолетовый";
                        addChild(_someTriangle);
 
 
                        //--- Размещаем круг ---//
                        _someCircle = new Circle();
                        _someCircle.x = 450, _someCircle.y = 200;
                        _someCircle.name = "Желтый, из Library";
                        addChild(_someCircle);
 
                }
 
 
        }
 
}

Выглядит так:
Main.swf   (4.4 Кб)


Видимо, такой подход кривоват, а идея со switch, наверное, весьма избыточна.
Также остаются некоторые слабо прояснённые моменты:

- Непонятно, как работать с безспрайтными Шейпами.
Если я присваиваю такому шейпу свойство .name то оно не проявляется, и все-равно он автоматом получает instanceN.

- Непонятно, как выцеплять пустоту : ) Пришлось обойтись отдельным событием MOUSE_OUT.

- Лучше ли применять события ROLL_OVER и ROLL_OUT в сравнении с MOUSE_OVER и MOUSE_OUT.

in4core 04.10.2013 01:36

Писал как то давно для одного проекта. ВОт вам на скорую руку

Код AS3:

package ru.stickery.views 
{
        import com.greensock.TweenMax;
        import com.in4core.text.DisplayText;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        /**
        * ...
        * @author in4core progression lab
        */

        public final class PopupHelp
        {
                static private var _view:Sprite;
                private static var _holder:Sprite = new Sprite();
 
                public function PopupHelp()
                {
 
                }
 
                public static function addView(view:Sprite):void
                {
                        _view = view;
                }
                public static function showHelp(text:String):void
                {
                        if(_view.contains(_holder)) _view.removeChild(_holder);
 
                        _view.addChild(_holder);
 
                        _holder.stage.removeEventListener(MouseEvent.MOUSE_MOVE , onMouseMove);
 
                        _holder.graphics.clear();
 
                        if (_holder.numChildren) _holder.removeChildAt(0);
 
                        const t:TextField = DisplayText.addField("Verdana_11pt_st" , 11 , true);
                        t.text = text;
                        t.textColor = 0xFFFFFF;
 
                        _holder.graphics.beginFill(0, 0.85);
                        _holder.graphics.drawRoundRect(0, 0, t.width + 10 , t.height + 20 , 8);
                        _holder.graphics.endFill();
 
                        _holder.addChild(t);
 
                        t.x = _holder.width / 2 - t.width / 2;
                        t.y = _holder.height / 2 - t.height / 2;
 
                        _holder.alpha = 0;
 
                        TweenMax.to(_holder , 0.5 , { alpha:1 } );
 
                        _holder.stage.addEventListener(MouseEvent.MOUSE_MOVE , onMouseMove);
                }
 
                static private function onMouseMove(e:MouseEvent):void
                {
                        _holder.x = e.stageX + 30;
                        _holder.y = e.stageY  ;
                }
 
                static public function hideHelp():void
                {
                        if(_view.contains(_holder)) _view.removeChild(_holder);
                }
        }
 
}

Код AS3:

package ru.stickery.controllers 
{
        import flash.display.DisplayObject;
        import flash.display.DisplayObjectContainer;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.utils.Dictionary;
        import flash.utils.setTimeout;
        import ru.stickery.views.PopupHelp;
        /**
        * ...
        * @author in4core progression lab
        */

        public class PopupHelpMessages
        {
                private static var _hash:Dictionary = new Dictionary(true);
 
                public static const notifications:Array = [
                ["Приветствие!","Приветсвуем Вас в приложении печати ArtPrint Office!\n\nЕсли у Вас возникли вопросы в течении работы, Вы можете обратится к администратору сайта, воспользовавшись секцией \"контакты\"."],
                ["Измерения", "Все размеры холста, фотографий, текста определяются в сантиметрах. Поэтому, когда Вы добавляется фотографию, она уменьшается пропорционально, переводя свои размеры из пикселей в сантиметры.\n\nДля справки : \n1 px = 0.026458333 cm\n1 cm = 37.795275591 px."],
                ["Изображения высокого качества. DPI", "Загружая фотографию с компьютера помните, что большинство экранных изображений имеют разрешение 72 DPI, такое качество пагубно скажется на итоговой печати, поэтому желательно загружать фотографии по качеству 300 DPI.\n\nЕсли Вы загрузили фотографию с вашего компьютера, пожалуйста позаботьтесь о том, чтобы оригинальная копия вашей фотографии никуда не потерялась. После оформления заказа, администратор потребует выслать (email) ему оригинальную копию вашей фотографии."],
                ["Координаты и клавиатура", "Координаты фотографий в результате сжатия или изменения размеров могут иметь неточные значения, поэтому в некоторых случаях центровка оказывается слегка неточной. В этом случае Вам помогут стрелочки на клавиатуре (влево, вправо, вверх, вниз) для подгонки координат к желаемым.\n\nДля удаления объекта с холста Вы можете также воспользоваться кнопкой Delete на своей клавиатуре."],
                ["Приступая к работе" , "Благодарим Вас, что выбрали Нас, мы не подведем!\n\nПри возникновении проблем в работе приложения незамедлительно отправьте email в отдел тех поддержки "mailto:tech@artprint.ru">tech@artprint.ru\n\nНажмите кнопку \"Начать!\", чтобы начать работу с приложением."]
                ]
                public static const helpMessages:Array = [
 
                //menu
 
                "Растянуть по вертикали" , //0
                "Растянуть по горизонтали" , //1
                "Центровать" , //2
                "Растянуть на весь экран", //3
                "Установить слой на верхний уровень" , //4
                "Установить слой на уровень ниже" , //5
                "Включить режим наложения Multiply" , //6
                "Отменить последнее действие\n ( поворот, размеры, положение )", //7
                "Удалить слой" , //8
                "Увеличить масштаб просмотра", //9
                "Уменьшить масштаб просмотра" , //10
                "Показать/скрыть сетку", //11
 
                // bottom
 
                "Выбрать размер стены/холста", //12
                "Установить ширину", //13
                "Установить высоту", //14
                "Выбрать фотографию с диска компьютера", //15
                "Выбрать фотографию из платной библиотеки Fotolia", //16
                "", //17
                "Для передвижения текста зажмите клавишу ctrl" // 18
 
                ]
 
                public static const textCrutch:String = "Для передвижения текста зажмите клавишу ctrl";
 
                public static function setHelp(source:DisplayObjectContainer , helpIndex:int , delay:int = 0):void
                {
                        _hash[source] = [helpIndex , delay];
 
                        source.addEventListener(MouseEvent.MOUSE_OVER , showHelp);
                        if (source.stage) source.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp);
                        else source.addEventListener(Event.ADDED_TO_STAGE , onAdded);
                }
 
                static private function onAdded(e:Event):void
                {
                        e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, onAdded);
                        e.currentTarget.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp);
                }
 
                static private function hideHelp(e:MouseEvent):void
                {
 
                        PopupHelp.hideHelp();
                }
 
                static private function showHelp(e:MouseEvent):void
                {
 
                        for (var i:* in _hash)
                        {
                                if ( i == e.currentTarget)
                                {
                                        setTimeout( PopupHelp.showHelp , _hash[i][1] , helpMessages[_hash[i][0]]);
                                        break;
                                }
                        }
                }
 
 
 
        }
 
}

Код AS3:

PopupHelpMessages.setHelp(source, helpNum);



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

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