|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Feb 2009
Адрес: WS
Сообщений: 93
|
Добавление клипа на сцену при помощи AS
Столкнулся с такой ситуацией:
Имеется класс HorizontalSlider, наследуемый от MovieClip, использующий EventDispatcher для упраления событиями. Имеется клип 'mc_round_slider' в библиотеке, который экспортирован для использования в AS в первый фрейм и в качестве класса ему указан наш HorizontalSlider. Имеется клип 'mc_control_window', внутри которого есть 'mc_round_slider' под именем 'slider'. Я делаю attachMovie для mc_control_window, т.е. программно добавляю его на сцену, после чего пытаюсь подписаться на событие 'change' моего слайдера: Однако ничего не происходит! То есть слайдер работает, я могу потаскать его мышкой, значение изменяется, но мой listener не ловит событие 'change'. Трейсил значение addEventListener - пишет undefined. Причем если добавлять просто слайдер методом attachMovie, то все листнеры работают. Может кто знает, почему так происходит и что нужно сделать, чтобы всё заработало? Я понимаю, что всё будет ОК, если слайдер инициализировать программно внутри 'mc_control_window', однако мне хочется, чтобы слайдер находился внутри окна как статический объект (в designtime) - так сразу во Flash понятно как на самом деле выглядит окошко. |
|
|||||
Регистрация: Jan 2008
Сообщений: 669
|
Попробуйте выложить код инициализации HorizontalSlider из конструктора в какой-нибудь метод, например init, и вызвать его прежде чем добавлять слушателя.
Еще заметил, что вы все время говорите о mc_control_window, а в коде прописано control_window. Если не получится, выложите исходник, упрощенный. |
|
|||||
Регистрация: Feb 2009
Адрес: WS
Сообщений: 93
|
Вот часть кода для главной сцены. Для клипа control_window.slider AS классом является HorizontalSlider (прописано в Linkage):
var control_window:MovieClip = attachMovie("mc_control_window", "control_window", 10); var somelst:Object = new Object(); somelst.change = function(evt:Object) { trace('value changed to: ' + evt.target.value); } control_window.slider.addEventListener('change', somelst); import mx.events.EventDispatcher; class Slider extends MovieClip { public static var CHANGE_EVENT:String = "change"; public static var BEFORE_CHANGE_EVENT:String = "beforeChange"; //--------- Implement EventDispatcher ------------// public var addEventListener:Function; private var dispatchEvent:Function; //----------------------------------------------// private var minval:Number = 0; private var maxval:Number = 100; private var val:Number = 50; public function Slider() { EventDispatcher.initialize(this); } //----------------- Value getters/setters ----------------------------------// public function get value():Number { return Math.round(val); } public function set value(v:Number) { setValue(v); dispatchEvent({type:CHANGE_EVENT, target:this}); } public function getValue():Number { return Math.round(val); } //Set value without event calling public function setValue(v:Number) { if (v < minval) { v = minval; } else if (v > maxval) { v = maxval; } val = v; } //-------------------------------------------------------------------------------// public function get minValue():Number { return minval; } public function set minValue(minv:Number) { if (minv > maxval) { minv = maxval; } minval = minv; //re-check value and raise onChange event setValue(val); dispatchEvent({type:CHANGE_EVENT, target:this}); } public function get maxValue():Number { return maxval; } public function set maxValue(maxv:Number) { if (maxv < minval) { maxv = minval; } maxval = maxv; //re-check value and raise onChange event setValue(val); dispatchEvent({type:CHANGE_EVENT, target:this}); } } import mx.utils.Delegate; class HorizontalSlider extends Slider { //--------- Visual slider elements ---------------------// private var handle:MovieClip; private var rail:MovieClip; private var txt:TextField; //------------------------------------------------------// private var enbl:Boolean = true; public function HorizontalSlider() { super(); this.addEventListener(CHANGE_EVENT, this); value = 100; if (handle._totalframes > 1) { handle.onRollOver = function() { this.gotoAndStop(2); } handle.onRollOut = function() { this.gotoAndStop(1); } } handle.onPress = Delegate.create(this, mouseDownHandler); rail.onPress = Delegate.create(this, function() { handle._x = this._xmouse - handle._width / 2; handle.onPress(); }); handle.onReleaseOutside = function() { if (this._totalframes > 1) { this.gotoAndStop(1); } this.onRelease(); } handle.onRelease = rail.onRelease = rail.onReleaseOutside = Delegate.create(this, mouseUpHandler); } private function mouseDownHandler() { if (!enbl) { return; } if (handle._totalframes > 1) { handle.gotoAndStop(3); } dispatchEvent( { type:BEFORE_CHANGE_EVENT, target:this } ); handle.startDrag(false, rail._x, handle._y, rail._x + rail._width - handle._width, handle._y); this.onEnterFrame = function() { value = MathUtil.getLinearInterpolation(rail._x, rail._x + rail._width - handle._width, minval, maxval, handle._x); } this.onEnterFrame(); } private function mouseUpHandler() { stopDrag(); this.onEnterFrame(); delete this.onEnterFrame; } public function setValue(v:Number) { super.setValue(v); } public function change() { var startX:Number = rail._x; var endX:Number = rail._x + rail._width - handle._width; handle._x = MathUtil.getLinearInterpolation(minval, maxval, startX, endX, val); txt.text = String(value); } public function get enabled():Boolean { return enbl; } public function set enabled(enbl:Boolean) { this.enbl = enbl; } } |
Часовой пояс GMT +4, время: 17:51. |
|
« Предыдущая тема | Следующая тема » |
|
|