Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 闪存AS3保存滑块值_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 闪存AS3保存滑块值

Actionscript 3 闪存AS3保存滑块值,actionscript-3,flash,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); f

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

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

}

您需要将该值存储在全局变量或静态变量中。如果不想进入自定义类文件和静态变量,使用时间线代码可以实现这一点的简单方法如下:

在根时间线代码中:

var sliderVal;
在您的时间线代码中(来自您的问题):


您的问题是没有将视图与模型(数据)分离,因此模型的寿命与视图的寿命相同。要使模型独立于视图而存在,需要使视图仅显示给定的值,并使外部值中的任何更改可供以后使用

比如说:

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并在那里更改音量。如果您将事件设置为bubbling,那么您可以一直在根目录上监听,您已经在那里存储了所有内容(显然)。不过,这不是很好的封装
  • 它完全是数据驱动的,这意味着如果您以前存储了sliderValue,那么将相同的值传递到sliderValue将使您看到相同的图片。或者,你可以从声音转换中读出它。希望您能更好地封装它,而不是像在原型代码中那样将其转储到根上
  • 当Flash从后台移除滑块时,它会自动移除侦听器,这可以防止内存泄漏

  • 无论是ActionScript2还是ActionScript3FWIW,全局值和静态值都是不好的做法,总是有办法避免它们。静态变量和方法肯定有它们的位置,只有在使用不当时才是不好的做法。持有通用卷值的静态类可以很好地使用静态值。对于运行时可能发生更改的任何内容,使用静态永远都不合适()。它们唯一适合的地方是枚举常量值。
    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;
       }
    }