您的问题是您没有将视图与模型(数据)分开,因此模型的生命周期与视图的生命周期相同。为了让模型独立于视图生存,您需要使视图仅显示它所给定的值,并将值的任何更改提供给外部以供以后使用。
所以,像:
public class SliderView extends MovieClip {
protected var _slider:Slider;
protected var _sliderValue:Number;
/*Flash will populate this variable for you if you put
a slider on the stage and give it an instance name of "slider."
*/
public function get slider():Slider {
return _slider;
}
public function set slider(value:Slider):void {
if (value != _slider) {
if (_slider) {
_slider.removeEventListener(SliderEvent.CHANGE, onSliderChange);
}
_slider=value;
if (_slider) {
_slider.addEventListener(SliderEvent.CHANGE, onSliderChange);
}
}
}
public function get sliderValue():Number{
return _sliderValue;
}
public function set sliderValue(value:Number):void {
if (value != _sliderValue) {
_sliderValue = value;
if (_slider) {
_slider.value = value;
}
dispatchEvent(new Event('sliderValueChanged'));//anything needing to know about the change is notified immediately
}
}
protected function onSliderChange(e:SliderEvent):void {
sliderValue = Slider(e.target).value;
}
}
请注意,从可维护性的角度来看,此代码比您发布的时间线样式代码具有几个优点。
- 它不是试图管理音量。这意味着即使您需要在其他地方使用它或您的 MC 结构发生变化,它也将继续工作。要管理音量,您需要在更高级别侦听 sliderValueChanged 并在那里更改音量。如果您将事件设置为冒泡,您可以在根目录处一直收听,您已经存储了所有内容(显然)。不过,这不是很好的封装。
- 它完全是数据驱动的,这意味着如果您之前存储了 sliderValue,将相同的值传递给 sliderValue 将导致您看到相同的图片。或者,您可以从 SoundTransform 中读取它。希望您能更好地封装它,而不是像在原型代码中那样将其转储到根目录中。
- 当 Flash 从舞台上移除 Slider 时,它会自动移除监听器,这样可以防止内存泄漏。