|
|
|||||
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Помогите разобраться с кнопкой
Привет всем!
Мне нужна панель из пяти одинаково выглядящих нестандартного вида кнопок с разными текстами: "min", "2 x min", "3 x min", "pot", "all-in". Так как я сугубый нуб в флеше, я сначала решил, что надо распотрошить стандартную кнопку компонент и привести ее к нужному виду. Я вставил кнопку на сцену и дважды кликнул на нее, и она "распалась" на ряд изображений ее отдельных фаз, но мне показалось сложным править их все, и потом я не знал как их собрать обратно, и что еще надо будет допилить, поэтому я пошел другим путем - путем создания кнопки с нуля. И столкнулся с проблемами. Прошу помочь. Свою кнопку я сделал так: Создал в Flash CS4 новый символ типа Button, создал изображения для up, down, over кадров. Проверил, что кнопка нажимается. Далее т.к. мне нужна была панель из одинаково выглядящих кнопок, но с разными надписями, я создал новый символ типа MovieClip - панель кнопок и разместил на ней пять моих одинаковых кнопок. Но надписи на кнопках должны быть разными! Пробовал менять надписи на кнопках, но сделать это получилось только редактированием символа, а при этом надписи менялись синхронно на всех 5 кнопках на панели. Я обломался делать пять похожих символов и решил изменить текст экземпляров каждой кнопки-символа на панели из конструктора класса, наследующего от класса панели. Я указал имена экземпляров для кнопок, для панели кнопок, и для динамик текстов на кнопках. Тут столкнулся с проблемами. 1) поскольку кнопка в кадрах up и down имеет различное положение (утапливается), то и текст на кнопке тоже должен утапливаться. Значит надо делать несколько Dynamic Text объектов сообразно кол-ву кадров? Правильно рассуждаю или надо как-то по-другому? 2) Если да, то значить им надо давать уникальные имена (Instance name), получается как-то избыточно что-ли. 3) Несмотря на то, что переменные, которые автоматом создаются если назначишь объекту Instance name, выбирались из списка автоподстановки после нажатия "." значение переменной title (динамик текст на кнопке) оказалось null. Почему? Вот мой код в конструкторе лейаута флешки: // Поменять текст на кнопках рейз панели var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"]; for (var i:int = 0; i < btn_array.length; i++) { //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null??? } Dynamic Text с именем экземпляра title я создал для проверки идеи только на кадре up, может в этом дело? Последний раз редактировалось zhoran; 27.12.2010 в 22:49. |
|
|||||
1. если кнопки все одинаковые и отличаются только текстом - достаточно нарисовать одну кнопку.
2. Чтобы текст при нажатии сделать "утопленным" - можно на текстовое поле навесить парочку пост-эффектов типа блюров или теней. Ну и чтоб они отличались на этих 4-х кадрах кнопки. Теперь собственно что надо сделать: 1. почитать документацию хотя бы официальную справку адоба. 2. у тайтла в символе кнопки сделать инстанс нейм. 3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск) 4. ну и далее по тексту. // Поменять текст на кнопках рейз панели var p:RaisePanelButtonGroupDesign = this.layoutDesign.blockLower.raisePanel.raisePanelButtonGroup var btn_array:Array = [p.btn1, p.btn2, p.btn3, p.btn4, p.btn5]; // btn1-5 автоподстанавливаются имена экз. кнопок var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"]; for (var i:int = 0; i < btn_array.length; i++) { //RaisePanelButtonDesign (btn_array[i]).title.text = btn_names[i]; // вылетает, т.к. title == null //Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием //trace(RaisePanelButtonDesign (btn_array[i]).title); // почему выводит null??? //null у нас тут по той же причине btn_array[i].title.text = btn_names[i]; trace(btn_array[i].title.text); //пробуйте так;) }
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Спасибо за ответы. Не получается.
Теперь собственно что надо сделать: 1. почитать документацию хотя бы официальную справку адоба. - Пока не нашел в ней ответ, но читаю. 2. у тайтла в символе кнопки сделать инстанс нейм. - это я сделал когда писал, иначе имя title не автоподставилось бы в редакторе. 3. если пишете в кадрах то в коде панели нужно пробежаться по всем инстансам кнопок и поменять текст тайтлов у всех кнопок на такой как вам надо(обращаться по инстансНеймам типа: myButton1.title) (хотя если кнопок всего пять, то проще будет сделать пять разных кнопок и не парить себе моск) - ну вроде в коде видно что я так и делаю, а рисовать пять почти одинаковых кнопок не хочу потому что не красиво. 4. ну и далее по тексту. trace(btn_array[\i].title.text); //пробуйте так - я же пишу, что btn_array[i].title == null, соответственно btn_array[i].title.text прекращает выполнение по причине вызова метода у null Уточняю, у меня в редакторе, когда я после btn_array[i] ставлю точку, появляется список, в котором есть свойство title, а когда я ставлю точку после btn_array[i].title в списке есть методы и свойства title, но в процессе выполнения почему-то title == null, хотя в кнопках текст есть. Не понимаю ( Может кто-нить сампл код привести который работает, чтобы у кнопки Dynamic Text поменялся? Последний раз редактировалось zhoran; 28.12.2010 в 23:31. |
|
|||||
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
//Вылетает так как вы пытаетесь привести батон к типу_с_длинным_названием
Нет, вылетает не поэтому, он пишет: [Fault] exception, information=TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". Переделал немного, чтобы не было явного приведения типа: for (var i:int = 0; i < btn_array.length; i++) { var btn:RaisePanelButtonDesign = btn_array[i]; trace(btn.title); // тут выводит null trace(btn.title.text); // а так выводит "[Fault] ... как в сообщении выше } зы А рабочий короткий пример можете выложить? Последний раз редактировалось zhoran; 29.12.2010 в 13:19. |
|
|||||
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Прикладываю StrangeButton.fla, StrangeButton.swc - в них только моя кнопка с Dynamic Text
а Main.as для примера вот: package { import flash.display.MovieClip; import poker.view.RaisePanelButtonView; import flash.events.Event; public class Main extends MovieClip { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point var button:RaisePanelButtonView = new RaisePanelButtonView(); this.addChild(button); trace(button.title); // почему null??? } } } |
|
|||||
Хз, короче У меня собственно тоже тайтл у кнопки поменять не получилось.
Но получилось его поменять, если делать кнопку не SimpleButton'ом а MovieClip'ом. Видимо батон не умеет с чилдами работать, мож кто более опытный подскажет. Единственное что если делать мувиклипом - то самому надо следить за событиями и менять визуальный образ. К тому же следует помнить что тайтл в кажддом кадре свой. И его надо менять во всех кадрах, если динамически ставить. С этим думаю разберетесь. Ну а я обычно вот так подобные вопросы решаю (тут курсор пальчиком не становится если на текст наводишь, не стал играться. Вообще по правильному надо поверху натянуть какую-то прозрачную плашку): package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.DropShadowFilter; import flash.text.TextField; /** * @author Dukobpa3 */ public class Main extends Sprite { private var btn_array:Array = []; private var btn_names:Array = ["min", "2 x min", "3 x min", "pot", "all-in"]; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point for (var i:int = 0; i < 5 ; i++) { var btn:Sprite = new Sprite(); btn.name = String(i); btn_array[i] = btn; btn.graphics.beginFill(0x666666); btn.graphics.drawRoundRect(0, 0, 70, 30, 4, 4); btn.graphics.endFill(); var title:TextField = new TextField(); title.width = 60; title.height = 20; title.x = 5; title.y = 5; title.text = btn_names[i]; title.selectable = false; title.autoSize = "center"; title.textColor = 0xffffff; btn.addChild(title); btn.x = i * 100; btn.buttonMode = true; this.addChild(btn); btn.addEventListener(MouseEvent.CLICK, onClick); btn.addEventListener(MouseEvent.MOUSE_DOWN, onDown); btn.addEventListener(MouseEvent.MOUSE_UP, onUp); btn.addEventListener(MouseEvent.ROLL_OVER, onOver); btn.addEventListener(MouseEvent.ROLL_OUT, onOut); } } private function onDown(e:MouseEvent):void { var but:Sprite = e.currentTarget as Sprite; but.y += 2; } private function onUp(e:MouseEvent):void { var but:Sprite = e.currentTarget as Sprite; but.y -= 2; } private function onOut(e:MouseEvent):void { var but:Sprite = e.currentTarget as Sprite; but.filters = []; } private function onOver(e:MouseEvent):void { var filter:DropShadowFilter = new DropShadowFilter(); var but:Sprite = e.currentTarget as Sprite; but.filters = [filter]; } private function onClick(e:MouseEvent):void { /*************** Do Something //****************/ trace("click: " + e.currentTarget.name); } } }
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Ок, буду изучать.
Кстати, да припоминаю, вроде читал, что батон отличается от мувика тем, что не может содержать другие мувики, кажется. Если не путаю. Спасибо за помощь! |
Часовой пояс GMT +4, время: 07:13. |
|
« Предыдущая тема | Следующая тема » |
Теги |
button |
|
|