Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать обычную кнопку? (http://www.flasher.ru/forum/showthread.php?t=147277)

XDiaBLo 30.11.2010 20:55

Как сделать обычную кнопку?
 
Я знаю про методики типа создания Sprite, и прикручивания всего нужного для имитации кнопки к нему, но я нашёл такой метод в интернете:
Код AS3:

import mx.controls.button;
private var asButton:Button = new Button();
asButton.x = 100;
asButton.y = 100;
asButton.id="actionscriptButton";
asButton.label = "ActionScript 3 Button";
addChild(asButton);

он у меня почему-то не работает. Как вообще можно чисто программным способом создать кнопку? Я работаю в FlashDevelop, c flex_sdk_4.1. Наверняка ведь есть способ сделать обычную простую кнопку с текстом, без всяких докручиваний Sprite.

КорДум 30.11.2010 20:58

Кнопка с текстом? Это Sprite, содержащий в себе SimpleButton с TextField сверху, у которого свойство selectable (так же его зовут?) поставлено в false. Я так давно нафигачил свой класс на основе своей кнопки.

goodguy 30.11.2010 21:07

Проще простого.
Код AS3:

var button:Button = new Button();
button.label = "Actionscript 3 Button";
button.addEventListener(ComponentEvent.BUTTON_DOWN, buttonClicked);

Работает как часы.

XDiaBLo 30.11.2010 21:43

Цитата:

Сообщение от goodguy (Сообщение 953739)
Проще простого.
Код AS3:

var button:Button = new Button();
button.label = "Actionscript 3 Button";
button.addEventListener(ComponentEvent.BUTTON_DOWN, buttonClicked);

Работает как часы.

Access of undefined property ComponentEvent.

Добавлено через 49 секунд
Цитата:

Сообщение от КорДум (Сообщение 953733)
Кнопка с текстом? Это Sprite, содержащий в себе SimpleButton с TextField сверху, у которого свойство selectable (так же его зовут?) поставлено в false. Я так давно нафигачил свой класс на основе своей кнопки.

Мда, ну это ведь тоже изврат, стандартной кнопки для использования из ActionScript нет нормальной?

goodguy 30.11.2010 21:48

Цитата:

Access of undefined property ComponentEvent.
Код AS3:

import fl.events.ComponentEvent;


Anton Riot 30.11.2010 21:52

стандартная кнопка есть в стандартных компонентах. Кроме этого, в них ещё много чего стандартного :)

КорДум 30.11.2010 21:56

Цитата:

Мда, ну это ведь тоже изврат, стандартной кнопки для использования из ActionScript нет нормальной?
Есть стандартная своя кнопка ;)

Dukobpa3 30.11.2010 22:12

Цитата:

Сообщение от XDiaBLo (Сообщение 953747)
Мда, ну это ведь тоже изврат

Ну че изврат сразу. У меня например тоже класс кнопки есть.

Называется скромно и со вкусом: UniversalButton. (Вообще типа универсальный батон, но можно и как космический читать:) кому как приятнее)
На самом деле является не кнопкой, а оберткой вида кнопки на любой DisplayObject.

Делается примерно так(это конструктор):
Код AS3:

UniversalButton(_source:DisplayObject = null, _simple:Boolean = false, _clickFunc:Function = null, _inactiveColor:int = 0x000000, _activeColor:int = 0xffffff)

в качестве сорса принимает любой DO сразу же на него навешивает всякие там "по наведению", "по клику" и прочее, если в этом сорце находит текстфилд с именем "title" - то работает с ним как с тайтлом. Если находит мувиклип двухкадровый с именем "icon" - то соответственно понимает что это икон.

имеет статусы активная/неактивная. татлу меняет цвет (берет из конструктора), а иконке переключает кадр (первый неактивный, второй активный)

_simple - это значит что простая кнопка, без тайтла и без иконки (влияет на эффекты при наведении и клике).

По клику вызывает функцию указанную в конструкторе, в качестве параметра в которую передает свой идентификатор.

В работе сей неказистый класс на 80 строк зарекомендовал себя отлично. И минус стопицот геморроя в отличии от работы со стандартными кнопками.

Psycho Tiger 30.11.2010 23:14

Это отвратительно что callback на клик задаётся явно.
Это значит что используя Вашу кнопку я не смогу вменяемо контролировать поток мышинных событий - тут запретить, тут продолжить, тут прекратить, а тут подписаться аж на 2 обработчика. Мне придется всегда занулять _clickFunc, и подписывать сам объект DisplayObject`а (предварительно, конечно, обёртывая его в спрайт если это не IneractiveObject - хотя это должна быть обязанность кнопки).

Dukobpa3 30.11.2010 23:22

Цитата:

Это отвратительно что callback на клик задаётся явно.
ну для каждой задачи свое решение. В тех моментах где я кнопку эту пользовал мне много обработчиков не требовалось. А кода экономит кучу. Вместо кучи подписок, я в родительском классе просто делаю функцию и всё ок.

А навешать дополнительно слушателей вам никто не запрещает даже с такой структурой. Так что комментарий по меньшей мере непонятен.

Данная кнопка перехватывает только маусОвер, маусКлик (рисует эффектик и передает в эту самую функцию свой идентификатор) и маусАут... собственно всё. Эти все обработчики событий занимаются только визуальной частью, если вам нужно на маусОвер повесить что-то функциональное - то без проблем, конфликтов не будет (есть подобная практика в работе с данным классом).

С кликом я вообще проблем не вижу. Редко когда мне нужно получить из MouseEvent.CLICK что-то окромя e.target - этот самый таргет я и принимаю в функции обработчике родительского класса.

Psycho Tiger 30.11.2010 23:54

Цитата:

А кода экономит кучу. Вместо кучи подписок, я в родительском классе просто делаю функцию и всё ок.
...Одну строчку?

Ладно, по пацански. Как бабблинг делать будете?

Dukobpa3 01.12.2010 00:05

Цитата:

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

Цитата:

Ладно, по пацански. Как бабблинг делать будете?
так же как все:)

Код AS3:

var DO:DisplayObject = new DisplayObject(); //ну тут кучу кода не привожу, в дисплайобжекте что-то визуальное должно быть.
var button:UniversalButton = new UniversalButon(DO, false, false, clickFunk);
 
button.addEventListener(MouseEvent.CLICK, clickFuncBubbl, true, false);
button.addEventListener(MouseEvent.CLICK, clickFuncStd);
 
private function clickFunk(source:UniversalButton):void{
      //Это мой обработчик
}
 
private function clickFunkBubbl(e:MouseEvent):void{
      //Это стандартный с бабблингом
}
 
private function clickFunkStd(e:MouseEvent):void{
    //это стандартный по-умолчанию, по сути дубль моего обработчика за исключением того что сюда приходит не таргет а полностью событие.
}

Добавлено через 27 минут
кстати, забыл упомянуть.

конструктор батона вполне может принимать в качестве функции-обработчика клика - null.

В этом случает отработаются сугубо визуальные эффекты. А функционально можно будет навесить свои слушатели как это обычно делается.

КорДум 01.12.2010 02:14

У меня сделано так: юзверь интерфейс кнопки содержит в себе базовый функционал и базовые сеттеры-геттеры для стейтов. Далее идеть россыпь классов - обычная кнопка, кнопка-текст и как бонус - кнопка с текстом. Никаких колбеков, опять же, бонуса ради у кнопки-текста - сеттер url:String, вешающий на клик обычный переход по ссылке. Ничего плохого в таком подходе я не вижу.

XDiaBLo 01.12.2010 09:49

Цитата:

Сообщение от Anton Riot (Сообщение 953755)
стандартная кнопка есть в стандартных компонентах. Кроме этого, в них ещё много чего стандартного :)

:))) Под стандартными компонентами вы поди имеете в виду накидать кнопок из панельки сбоку у Adobe Flash CS? Я его не использую :) А во FlashDevelop программно создать, гемморой целый.

З.Ы. Я вечером ещё раз гляну всё что тут написали, но пока я скажу, что вчера вечером взял VKButton из АПИ вк онтакте, и переделал как нужно. Эта кнопка конечно странная малость, я ещё поработаю над ней, но более менее работает, сделана на основе SimpleButton. В принципе раз я делаю приложение для Вк онтакте, то ничего страшного что дёрну пару заготовок из их же корявых примеров. Лишь бы работало как следует.

goodguy 01.12.2010 11:22

Цитата:

А во FlashDevelop программно создать, гемморой целый.
Так уж и гемморой. Я уже много раз это делал во флеш девелоп, даже мысли не возникало, что это сложно

На крайняк всегда можно сделать собственную кнопку. Уж это явно не сложная задача ;)

Котяра 01.12.2010 12:39

Вопрос, наверное, состоял в том, что FD не видит классы флэшевских компонент.
Решение: создайте swc либу компонент, либо скачайте её здесь.
И подключите её к FD.

Psycho Tiger 01.12.2010 15:46

@Dukobpa3, и в итоге будет каша непонятная. Где подписались так, где подписались иначе.

Я был невменяем когда писал про бабблинг. Какой нафиг "делать бабблинг" у событий мыши? А Вы мне вообще про каптюр фазу писали.

sikha 15.05.2011 01:45

Цитата:

Сообщение от XDiaBLo (Сообщение 953747)
Access of undefined property ComponentEvent.

Добавлено через 49 секунд

Мда, ну это ведь тоже изврат, стандартной кнопки для использования из ActionScript нет нормальной?

А у меня вот не работает и даже с import'ом !(((

Добавлено через 54 секунды
еще в силу кнопок! Тоже есть такая вопрос как создать кнопку программно! может кто-то поделится своим классом для кнопки???
у меня вот такой код есть
Код AS3:

        package 
{
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.*;
 
 
        public class Main  extends Sprite
        {
 
 
 
                public function Main():void
                {
                        var bt:SimpleButton = new SimpleButton();
                        addChild(bt);
                        bt.addEventListener(MouseEvent.CLICK, btClick);
                }
 
 
 
        public function btClick():void {
                                trace("But clicked");
                        }
 
        }
 
}

но ни капельки не работает (((

КорДум 15.05.2011 01:57

sikha, смотрим сюда: http://help.adobe.com/ru_RU/AS3LCR/F...leButton%28%29


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

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