flex控制音量 slider hslider 注释全

  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="myInit()">   
  3.  <mx:Script>   
  4.   <![CDATA[   
  5.   import flash.events.*;   
  6.   import flash.net.URLRequest;   
  7.   import flash.media.Sound;   
  8.   import flash.media.SoundChannel;   
  9.   import flash.media.SoundTransform;   
  10.   import flash.utils.Timer;   
  11.   import flash.events.TimerEvent;   
  12.   import mx.controls.Alert;   
  13.     
  14.   //mp3 的 url 地址   
  15.   private var soundURL:String = "asflex.mp3";   
  16.   //访问 url 上的东西都用 URLRequest 了   
  17.   private var request:URLRequest = new URLRequest(soundURL);   
  18.   private var my_sound:Sound=new Sound(); // 新建 Sound 对象   
  19.   //声明 SoundChannel 类型的变量 my_channel   
  20.   private var my_channel:SoundChannel;   
  21.   //新建 myTimer 对象并定义循环的时间间隔为10毫秒,循环次数为无限次(参数中的0表示无限次)   
  22.   private var myTimer:Timer = new Timer(100);   
  23.       
  24.   private function myInit():void{   
  25.    my_sound.load(request); // 载入外部 mp3: She is my sin.mp3   
  26.    }   
  27.   //播放音乐:   
  28.   private function playSound(): void{   
  29.    Alert.show(my_sound.length.toString());   
  30.    my_channel = my_sound.play(); // 音乐正式开始播放   
  31.    //添加事件侦听器, 功能: 循环执行 timerHandler 函数(但这里还没有开始循环执行)   
  32.    myTimer.addEventListener(TimerEvent.TIMER, timerHandler);   
  33.    myTimer.start(); // 这里才开始循环执行 timerHandler 函数   
  34.   }   
  35.   //停止音乐:   
  36.   private function stopSound():void{   
  37.    //停止对函数 timerHandler 的循环执行, 因为音乐开始时 myTimer 对象就对函数 timerHandler 循环执行了   
  38.    myTimer.stop();   
  39.    my_channel.stop(); // 正式停止音乐   
  40.    progress_hs.value = 0; // 使那"播放进度"条的值回到0,即回到最左端   
  41.   }   
  42.   //定义被 myTimer 循环执行的函数 timerHandler   
  43.   private function timerHandler(event:TimerEvent):void{   
  44.   //功能: 显示音乐的播放进度, 进度条会随着音乐的继续播放而向右缓缓移动;   
  45.   //把这个公式翻译为中文: 播放进度条的值=当前音乐播放时间/音乐的总时间   
  46.    progress_hs.value = my_channel.position/my_sound.length;   
  47.   }   
  48.   //改变播放进度: 每当 "播放进度" 条被用户拉动过而使其值改变时,就执行以下函数   
  49.   private function changeProgress():void{   
  50.    //音乐停止且必须停止,是为了从新的播放时间点开始播放   
  51.    //(感觉这里麻烦了点, 如果有更好的方法,恳请高手指点!请联系我:   
  52.    // www.Y-boy.cn 或 www.RiaHome.cn ,谢谢!)   
  53.    my_channel.stop();   
  54.    //使音乐从新的时间点开始播放,新的时间点是小括号内的值,   
  55.    //即:"播放进度"条的值*音乐的总时间, 为什么会这样呢?   
  56.    //因为 HSlider 控件(那条"播放进度")的长度在下面被定义为1,   
  57.    //使得"播放进度"条的值在闭区间[0,1]内, 所以只需再乘以音乐的总时间就行了   
  58.    my_channel = my_sound.play(progress_hs.value*my_sound.length);   
  59.   }   
  60.   //改变音量: 每当 "音量大小" 控制条被用户拉动过而使其值改变时,就执行以下函数   
  61.   private function changeVolume():void{   
  62.    //把 my_channel.soundTransform 赋值给 my_transform   
  63.    var my_transform:SoundTransform = my_channel.soundTransform;   
  64.    my_transform.volume = volume_hs.value; // 把"音量大小"控制条当前值赋给 my_transform.volume   
  65.    my_channel.soundTransform = my_transform; // 给 my_channel.soundTransform 赋值   
  66.    /*   
  67.         这里的用法很特别, 像使用 AS2.0 里面的滤镜(Filters)那样, 先创建一个 "第三者",   
  68.     对 "第三者" 进行操作, 最后才把 "第三者" 赋值给 "当事人" . AS2.0 里面的滤镜的 "第三者"  
  69.     是数组, 这里的 "第三者" 是 my_transform . 这里不能跟 AS2.0 里面的滤镜相比, 只不过为   
  70.     了方便理解, 才这么说. (个人见解, 如有错请指出!)   
  71.    */   
  72.   }   
  73.   //改变左右声道: 每当 "左右声道" 控制条被用户拉动过而使其值改变时,就执行以下函数   
  74.   private function changePan():void{   
  75.    //此处用法与上面的 改变音量 相同, 理解 改变音量 的, 就能理解这里   
  76.    var my_transform:SoundTransform = my_channel.soundTransform;   
  77.    my_transform.pan = pan_vs.value;   
  78.    my_channel.soundTransform = my_transform;   
  79.   }    
  80.     
  81.   ]]>   
  82.  </mx:Script>   
  83.     
  84.  <!-- 显示歌曲名称 -->   
  85.  <mx:Label text="歌曲:She is my sin" fontSize="12"/>   
  86.     
  87.  <!-- 播放进度条 -->   
  88.  <mx:Label text="播放进度:" fontSize="12" y="25"/>   
  89.  <mx:HSlider id="progress_hs" width="100" minimum="0" maximum="1"  
  90.   x="60" y="25" mouseDown="myTimer.stop()" mouseUp="myTimer.start()"  
  91.   change="changeProgress()"/>   
  92.     
  93.  <!-- 音量控制条 -->   
  94.  <mx:Label text="音量大小:" fontSize="12" y="52"/>   
  95.  <mx:HSlider id="volume_hs" width="100" minimum="0" maximum="1"  
  96.   y="52" x="60" value="0.8" change="changeVolume()"/>   
  97.     
  98.  <!-- 左右声道控制条 -->   
  99.  <mx:Label text="左右声道:" fontSize="12" x="-1" y="78"/>   
  100.  <mx:HSlider id="pan_vs" width="100" minimum="-1" maximum="1"  
  101.   x="60" y="80" value="0" change="changePan()"/>   
  102.     
  103.  <!-- 播放和停止按钮 -->   
  104.  <mx:Button label="play" y="116" x="50" click="playSound()"/>   
  105.  <mx:Button label="stop" y="116" x="109" click="stopSound()"/>   
  106. </mx:Application>  
posted on 2010-01-26 10:27  遥望大海,云卷云舒  阅读(3048)  评论(0编辑  收藏  举报