2012-08-27 3 views
0

배경 음악의 볼륨을 조절하는 슬라이더가 있습니다. 슬라이더 구성 파라미터 값 플래시 AS3 슬라이더 값 유지

은 : I는 2 슬라이더를 다른 무비 클립을 이동하면 I 5.

로 설정. 그리고 나서 슬라이더로 값을 5로 되돌립니다. 어떻게 5를 표시하는 대신 2의 값을 저장할 수 있습니까?

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

이 액션 스크립트 2, 액션 스크립트 3 – BadFeelingAboutThis

+0

액션 스크립트 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

정적 변수와 메소드는 분명히 그 자리를 차지하고 적절하게 사용되지 않을 경우 나쁜 습관 일뿐입니다. 내가 말하고자하는 보편적 인 볼륨 값을 가지고있는 Static 클래스는 정적 인 값을 잘 사용한다. – BadFeelingAboutThis

+0

런타임에 변경할 수있는 어떤 것에 대해서도 statics를 사용하는 것은 결코 적절하지 않다. (http://misko.hevery.com/2008/11/21/clean-code-talks-global-state-and-singletons /)를 사용합니다. 그들이 적합한 유일한 위치는 상수 값을 열거하기위한 것입니다. –

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를 상위 레벨에서 수신하고 볼륨을 변경하십시오. 이벤트를 버블 링 (bubbling)으로 설정하면 루트에서 모든 것을들을 수 있습니다. 여기서 모든 것을 저장했습니다 (분명히). 그것은 매우 좋은 캡슐화는 아니지만.
  2. 그것은 완전히 데이터는 의미 중심의 사용자들은 이전 sliderValue에 같은 값이 같은 사진을 볼 발생할 것이라는 점을 전달하는 sliderValue를 저장 한 경우. 또는 SoundTransform에서 읽을 수도 있습니다. 다행히도 프로토 타입 코드에서와 같이 루트에 덤핑하는 것보다 더 잘 캡슐화 할 수 있기를 바랍니다. 플래시 메모리 누수를 방지 할 수있는 단계에서 슬라이더를 제거 할 때
  3. 그것은 자동으로 리스너를 제거합니다.