flash AS3保留滑块值

时间:2012-08-27 16:19:48

标签: actionscript-3 flash

我有一个控制背景音乐音量的滑块。

在滑块组件参数值中:我将其设置为5.

当我将滑块滑动到2并导航到其他影片剪辑时。然后返回滑块,值为5.如何存储2的值而不是显示5?

import fl.events.SliderEvent;
import flash.media.SoundTransform;

var myTransform = new SoundTransform();

scMC.addEventListener(SliderEvent.THUMB_DRAG, changeVolume);

function changeVolume(event:SliderEvent):void{
MovieClip(this.root).myChannel.soundTransform = myTransform;
myTransform.volume = scMC.value;
volumeText.text = "Volume is " + scMC.value;

}

2 个答案:

答案 0 :(得分:0)

您需要将值存储在全局变量或静态变量中。如果您不想进入自定义类文件和静态变量,可以使用时间轴代码执行此操作的简单方法如下:

在根时间轴代码中:

var sliderVal;

在您的滑块父母时间轴代码中(来自您的问题):

var myTransform:SoundTransform = new SoundTransform();

scMC.addEventListener(SliderEvent.THUMB_DRAG, changeVolume);

if(this.root["sliderVal"]){
    scMC.value = this.root["sliderVal"];
}

function changeVolume(event:SliderEvent):void{
    myTransform.volume = scMC.value;
    this.root["sliderVal"] = scMC.value;
    MovieClip(this.root).myChannel.soundTransform = myTransform;
    volumeText.text = "Volume is " + scMC.value;

} 

答案 1 :(得分:0)

您的问题是您没有将View与模型(数据)分开,因此模型的生命周期与View的生命周期相同。为了使模型能够独立于视图生存,您需要使视图仅显示它给出的值,并将值的任何更改提供给外部以供以后使用。

所以,比如:

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;
   }
}

请注意,从可维护性角度来看,此代码与您发布的时间轴样式代码相比具有多个优势。

  1. 它没有尝试管理音量。这意味着即使您需要在其他地方使用它或MC的结构发生变化,它仍将继续工作。要管理音量,您需要在更高级别侦听sliderValueChanged并在那里更改音量。如果你将事件设置为冒泡,你可以在根目录一直收听,你已经存储了所有内容(显然)。但这并不是很好的封装。
  2. 它完全是数据驱动的,这意味着如果您之前存储了sliderValue,则将相同的值传递给sliderValue将导致您看到相同的图片。或者,您可以从SoundTransform中读取它。希望你能更好地封装它,而不仅仅是在原型代码中将它转储到根目录上。
  3. 当Flash从舞台上移除Slider时会自动删除侦听器,这可以防止内存泄漏。