2012-08-27 74 views
0

我有控制背景音樂的音量滑塊。閃光AS3保存滑塊值

在滑塊元件參數值:我將其設置爲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; 

} 
+0

這是actionscript 2還是actionscript 3 – BadFeelingAboutThis

+0

actionscript 3. – DANLEE

回答

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; 

} 
+0

FWIW,全局值和靜態值都是不好的做法,並且總是有一種方法可以避免它們。 –

+1

靜態變量和方法當然有其自己的位置,並且只有在不適當使用時纔是不好的做法。持有通用音量值,我會說一個靜態類是用好一個靜態值的 – BadFeelingAboutThis

+0

這是從來沒有適合使用於任何可以在運行時改變(http://misko.hevery.com/2008/11/21靜/清潔碼會談,全球國家和單身/)。唯一適合的地方是枚舉常量值。 –

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的階段,這可以防止內存泄漏刪除滑塊。