Просмотр полной версии : замена upState у кнопки
собственно, можно ли подменить upState или downState у кнопки картинкой, подгруженной из вне?
делал што-то типа:
var button_up:Loader = new Loader();
button_up.load(new URLRequest("C:\\images\\button_up.png"));
nextButton.upState = Sprite(button_up);
съедает, но upState пропадает вообще.
Я так понимаю, вы пользуетесь ужасным родным классом SimpleButton? Напишите свою кнопку, где это будет возможно.
А есть еще поиск, где можно найти это: http://www.flasher.ru/forum/showthread.php?t=153625&highlight=%F1%EC%E5%ED%E8%F2%FC+simplebutton+%F1%F2%E5%E9%F2
я не понимаю этой строчки и getDefinitionByName в частности))
arr_btn[0].upState = new (getDefinitionByName("new_button") as Class)();
попробовал по аналогии
bmp = button_up as Bitmap;
nextButton.upState = new (getDefinitionByName("Bitmap") as Class)();
но эффект тот же (
Ну во-первых, есть хелп. Во-вторых, говорю вам, пишите свою кнопку.
nextButton.upState = new (getDefinitionByName("Bitmap") as Class)();
Эта строчка создала новый пустой экземпляр класса Bitmap и поместила его в качестве upState у кнопки.
так а просто new Bitmap() не попрет?
а в своей кнопке каким образом реализовать подгрузку картинки из вне? я может глупость какую спрашиваю, но чот правда не соображу как быть.
так а просто new Bitmap() не попрет?
Естественно пойдет.
В своей кнопке сделайте upState контейнером и грузите в него, что хотите.
бррр... так зачем же тогда так... эммм... извращаться?? или различия все же есть? и почему в таком случае мой первый вариант не работает? как туда непустой Bitmap поместить?
Это не извращения, это обычная практика. Контейнер - это Sprite, к примеру.
По идее надо просто так:
nextButton.upState = loader.content as DisplayObject;
Вообще адобовцы сделали непонятный класс. Если это не пройдет, пишите свою кнопку.
КОнечно же, нужно сначала дожидаться, когда картинка скачается.
не прошло) вообще говорит, што контент пустой.
не пойму, как мне сделать upState спрайтом.
мне нужно сделать спрайтом фон кнопки? т.е. я создаю кнопку, в ней на upState помещаю фон, который является наследником Sprite? и менять тогда не upState, а его ребенка, т.е. фон?
Загрузки то дождались?
Судя по всему нет, меня проигнорировали =(
мне нужно сделать спрайтом фон кнопки? т.е. я создаю кнопку, в ней на upState помещаю фон, который является наследником Sprite? и менять тогда не upState, а его ребенка, т.е. фон?
Сделайте, как сказал я и не мучайтесь.
upState — ссылка на ваш DisplayObject. Так и пихайте в него DisplayObject.
ммм... да, пардоньте, исправился, теперь контент не пустой, но все же upState просто пропадает и все.
Пишите свою кнопку. Помнится, год назад пытался сделать то же, плюнул и переписал все, накрутив наворотов.
Добавлено через 1 минуту
Хотя... попробуйте вот так:
(btn.upState as DisplayObjectContainer).addChild(loader.content as DisplayObject);
Если получится, перед добавлением очищайте содержимое контейнера. Ну и, конечно же, вы сначала в upState должны поместить потомок DisplayObjectContainer, иначе вылетит RTE, что будет логичным.
Сделайте, как сказал я и не мучайтесь.
так в том и дело, что я никак не пойму, как ((
Мы наверно опять разминулись. Я выложил пример еще один.
попробовал, но это внешне вообще никак не проявилось ) может этого ребенка на передний план как-то вынести надо?
Он и так будет на переднем плане.
Сейчас наваяю простенький пример и вам покажу.
Добавлено через 12 минут
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
/**
* @author KorDum
*/
public class Main extends Sprite {
[Embed(source = '../bin/state.gif')] private var State:Class;
private var _loader:Loader;
private var _button:SimpleButton;
public function Main():void {
_loader = new Loader();
_loader.load(new URLRequest('1.gif'));
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onCompleteHandler);
var state:Bitmap = new State() as Bitmap;
_button = new SimpleButton(state, state, state);
addChild(_button);
}
private function _onCompleteHandler(e:Event):void {
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _onCompleteHandler);
_button.upState = _loader.content;
}
}
}
Простой, насколько смог.
ога, спасибо большое! в принципе, ничего нового, но работает... я кнопки создавал визуально, а тут в коде - может поэтому?
State.gif в этом примере - што-то типа заглушки? в смысле можно же заменить пустыми битмапами?
Чем угодно, хоть другими кнопками ;)
Там вот кнопочка-весы справа есть =)
гм, upState заменился успешно, по аналогии заменил downState (ждал загрузок, все дела :) ), но на щелчок мышью кнопка не реагирует
var button_up:Loader = new Loader();
var button_down:Loader = new Loader();
var btn:SimpleButton;
public function Main()
{
button_up.contentLoaderInfo.addEventListener(Event.COMPLETE, compUp);
button_up.load(new URLRequest("C:\\images\\button_up.png"));
button_down.contentLoaderInfo.addEventListener(Event.COMPLETE, compDown);
button_down.load(new URLRequest("C:\\images\\button_down.png"));
var bmp:Bitmap = new Bitmap();
btn = new SimpleButton(bmp,bmp,bmp);
addChild(btn);
}
function compUp(event:Event)
{
trace("!!");
btn.upState = button_up.content;
}
function compDown(event:Event)
{
trace("@@");
btn.downState = button_down.content;
}
вроде так
А где вы присоединили слушатель кнопке? ;)
а ей разве нужен слушатель для проигрывания анимации? т.е. для перехода с upState на downState.
неужели дело в слушателе?! сейчас... )
Добавлено через 1 минуту
аха... дело не в слушателе, наверн... щелчок мыши просто не доходит до кнопки...
Добавлено через 4 минуты
btn.addEventListener(MouseEvent.CLICK, paymentType);
все верно же? )) мне к кнопке обращаться по имени btn (исходя из того, што я выложил выше)?
А, вот в чем дело. Задайте ей hitTestState. Или вручную, или в конструктор передайте.
Знатное колдовство. Главное, чтобы дальше класс расширять не пришлось.
Главное, чтобы дальше класс расширять не пришлось.
Это каким надо быть изв...ергом, чтобы такое сделать? ;)
Это каким надо быть изв...ергом, чтобы такое сделать? ;)
Ну я не имею в виду сам SimpleButton :) Просто в 2 раза легче было бы написать свой батон с блэкджеком и распущенными девицами, чем впихивать все это в кривой симплбатон :away:
О, премного благодарен! )
Ну я не имею в виду сам SimpleButton Просто в 2 раза легче было бы написать свой батон с блэкджеком и распущенными девицами, чем впихивать все это в кривой симплбатон
Я три страницы темы это говорил =)
Ну человеку надо ж было помочь:quiet:
Хорошо, напишу и тут:
пишите свою кнопку и не будет никаких проблем!
:D
Да, нужно прекращать флудить - наругаются =)
так а как ее писать? ) создавать свой мувиклип с четырьмя кадрами, цеплять к нему класс-наследник от мувиклипа и т.п.?
так а как ее писать? ) создавать свой мувиклип с четырьмя кадрами, цеплять к нему класс-наследник от мувиклипа и т.п.?
Конечно.
Фу. Сделайте спрайт и стейты меняйте по событиям.
Ну кому что, короче. Главное от симплбатона избавьтесь.
В общем я попробовал создать свою кнопку. Тут по ходу пьесы еще выяснилось, што необходимо наличие затяжного нажатия, так сказать, что в основном меня и спровоцировало перейти к мувиклипу. Вот мои попытки:
создал MovieClip с тремя ключевыми кадрами (так сказать upState, начало downState и окончание downState), причем кадры пустые.
создал класс MyButton:
package {
import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.net.URLRequest;
import flash.display.LoaderInfo;
public class MyButton extends MovieClip
{
public var upState:Bitmap;
public var downState:Bitmap;
public var currState:Bitmap;
public function MyButton(_upState:Bitmap, _downState:Bitmap)
{
upState = _upState;
downState = _downState;
currState = upState;
gotoAndStop(1);
addChild(currState);
}
public function pressed()
{
gotoAndStop(2);
removeChild(currState);
currState = downState;
addChild(currState);
play();
}
public function unpressed()
{
gotoAndStop(1);
removeChild(currState);
currState = upState;
addChild(currState);
}
}
}
тут, в принципе, можно убрать currState, походу... ну эт ладно )
в основном классе пишу:
package my
{
//всякие импорты
public class Main extends MovieClip
{
//всякие переменные )
var button_up:Loader = new Loader();
var button_down:Loader = new Loader();
var up : Boolean = false;
var down : Boolean = false;
var btn : MyButton;
public function Main()
{
button_up.contentLoaderInfo.addEventListener(Event.COMPLETE, compUp);
button_up.load(new URLRequest("C:\\images\\back_up.png"));
button_down.contentLoaderInfo.addEventListener(Event.COMPLETE, compDown);
button_down.load(new URLRequest("C:\\images\\back_down.png"));
}
function compUp(event:Event)
{
trace("!!");
up = true;
if (up && down)
{
btn = new MyButton(Bitmap(button_up.content), Bitmap(button_down.content));
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, my);
}
}
function compDown(event:Event)
{
trace("@@");
down = true;
if (up && down)
{
btn = new MyButton(Bitmap(button_up.content), Bitmap(button_down.content));
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, my);
}
}
function my(event:MouseEvent)
{
btn.pressed();
//всякий код )
}
}
}
и в последнем третьем ключевом кадре моей кнопки я вызываю unpressed();
В принципе, все вроде работает как надо, но понимаю, што сделано через *опу )
так вот, может кто-нибудь што-нибудь присоветовать ценного? ) в частности, как в моем случае избавиться от кода в кадре? )
Нет, у вас сам подход неверный (хотя его можно допилить, но лучше сделать сразу, как надо). Смысл такой: мы передаем в конструктор кнопки хэш/по отдельности каждый стейт/словарь, все, что надо, словом. Стейт с нажатием у вас будет либо отдельным спрайтом со своими контроллером анимации, либо отдельным мувиклипом со stop() в конце - я бы выбрал первый вариант, ибо давно уже к FlashIDE не прикасаюсь вообще, предпочитая писать на чистом as3.
Теперь сама кнопка. Сначала мы создаем upState, по наведению мы удаляем вообще upState, на его место приходит overState. Он создается с нуля, так же, как и downState. Удяляются стейты тоже с концами, то есть со всеми отписками, занулениями. Вот так, все просто.
Большое спасибо за ответ! но возникло еще больше вопросов! ))
Меня вообще overState не интересует, поэтому остаются только up & down, которые я и передаю в качестве параметров (просто картинки, которые сменяются одна другой). Так што тут все верно же? ) храню я все это дело в свойствах класса, так?
А почему нажатие должно быть отдельным мувиклипом? и stop() в конце - это на кадре? А што за контроллер анимации у спрайта? я вообще не в теме ) и если я остановлю свой выбор таки на мувиклипе - ничего особо плохого не случится? ))
И если сама кнопка мувиклипом будет - тоже ничего ужасного? )
И я неверно сменял стейты? што значит, удалять с отписками и занулениями? они у меня вроде ни в чем не участвуют, а мышь слушает сама кнопка, не ее стейт же, правильно?
А. Меня смутило это:
public function pressed() {
gotoAndStop(2);
removeChild(currState);
currState = downState;
addChild(currState);
play();
}
У вас примитивная кнопка, получается. Тут либо клип с двумя кадрами, либо спрайт с динамической сменой стейтов. Для того, чтобы они не висели в памяти, так как кнопок может быть очень много, лучше всего ненужный стейт вообще удалять, отписывать от событий (если таковые имеются, но в вашем случае оно не надо), а затем занулять.
И да, не "што", а "что".
Тут либо клип с двумя кадрами
Для затяжного нажатия же нужно три, нет? Или картинки менять в первом?
Для того, чтобы они не висели в памяти, так как кнопок может быть очень много, лучше всего ненужный стейт вообще удалять, отписывать от событий (если таковые имеются, но в вашем случае оно не надо), а затем занулять.
Но как потом получать очередной стейт? опять грузить с жесткого? это будет занимать время...
В итоге, получается, мне конструкцию оставить такой, какая она есть?
И да, не "што", а "что".
В таком случае уж и не "вас", а "Вас" ;)
Для затяжного нажатия же нужно три, нет?
Что значит "зятяжное нажатие"?
опять грузить с жесткого
Это как так у вас оно грузится, что с винта?
это будет занимать время...
Поверьте, если у вас кнопка не 8000*8000, то вы даже не заметите разницу по времени. И то, с нынешними компьютерами, кажется, и 8000 на 800 точек не проблема быстро отрисовать.
В таком случае уж и не "вас", а "Вас"
"Вас" - для документов ;)
"Затяжное нажатие" - это не один кадр, который проигрывается, пока нажата кнопка мыши, а несколько кадров, содержащих одно и то же, но проигрывающихся, не зависимо от длины клика.
Ну пока с винта, в дальнейшем - с какого-нибудь места в сети. Вообще, грубо говоря, все ресурсы компа будут направлены на данное приложение, так што хранить десяток кнопок в памяти - не проблема, я думаю. В связи с этим возникает вопрос: можно ли как-то дождаться подгрузки всех состояний кнопок и только потом запускать основное приложение?
"Вас" - для документов
для любого обращения к конкретному лицу, в данном случае ко мне, хотя я и не филолог, конечно... В общем, думаю, не стОит развивать эту тему, согласны? )
"Затяжное нажатие" - это не один кадр, который проигрывается, пока нажата кнопка мыши, а несколько кадров, содержащих одно и то же, но проигрывающихся, не зависимо от длины клика.
Таймер поможет.
Я тоже думал об этом, но это ли не лишний наворот?
И, скажите, Вас приведенный класс устраивает, если исходить из поставленных целей?
Нет, не устраивает, я не люблю мувиклипы :D
И не использую FlashIDE. Могу поделиться своей кнопкой в личку.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.