0

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

在滑块组件参数值中:我设置为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;

}
4

2 回答 2

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;

} 
于 2012-08-27T17:27:39.957 回答
0

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

所以,像:

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 时,它会自动移除监听器,这样可以防止内存泄漏。
于 2012-08-28T02:18:13.773 回答