中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Flex播放器(實(shí)現(xiàn)播放、緩沖進(jìn)度條和音頻曲線顯示)
來(lái)源:易賢網(wǎng) 閱讀:1420 次 日期:2014-08-10 17:19:47
溫馨提示:易賢網(wǎng)小編為您整理了“Flex播放器(實(shí)現(xiàn)播放、緩沖進(jìn)度條和音頻曲線顯示)”,方便廣大網(wǎng)友查閱!

一時(shí)興起,玩起了Flex,本來(lái)還想要做個(gè)Flex博客,不過(guò)目前還只能在里面樹個(gè)公告。。。沒(méi)辦法做完啊,河蟹的個(gè)杯具的!Flex布局不像是CSS,精美Flash動(dòng)畫不是拖一個(gè)兩個(gè)控件就能做出來(lái)滴,而是一筆一條線繪制出來(lái)滴!這些我都還不熟悉,所有折騰快一個(gè)星期了,每天都是搞到頭大才睡覺(jué),今天終于能出一個(gè)簡(jiǎn)單的播放器。

一直很喜歡音樂(lè)這個(gè)東西,喜歡Jay,更喜歡他的歌,也很崇拜小豬,他的一段灰色空間曾讓我激流奮進(jìn),想過(guò)自己能做個(gè)播客放自己喜歡聽的歌曲,出于自戀那樣會(huì)更有一點(diǎn)點(diǎn)滿足感。呃~走神了,前二天無(wú)意看到一群教師的個(gè)人博客,深深的被他們的博文所吸引,無(wú)論是談技術(shù)還是記錄生活的,寫得都是那么的真切,還有堅(jiān)持每日一博的,堅(jiān)持不放棄...

mx:ProgressBar實(shí)現(xiàn)加載歌曲緩沖進(jìn)度條

ProgressBar有三大mode模式,分別為event、manual、polled,event為基于事件驅(qū)動(dòng)模式,可設(shè)置source對(duì)象自動(dòng)顯示加載進(jìn)程;manual為手動(dòng)模式,需要調(diào)用ProgressBar.setProgress()方法設(shè)置滾動(dòng)條進(jìn)度;polled為輪詢模式,本例使用的manual模式,Sound加載load請(qǐng)求歌曲添加一個(gè)ProgressEvent.PROGRESS處理中監(jiān)聽事件,然后根據(jù)Sound已加載的bytes和bytesTotal數(shù),設(shè)置setProgress進(jìn)度。這里需要注意在切換歌曲的時(shí)候先要移除ProgressEvent.PROGRESS事件,否則之前播放歌曲還未加載完又切換load新歌曲時(shí)回出現(xiàn)ProgressBar觸發(fā)多個(gè)PROGRESS事件被設(shè)置進(jìn)度出現(xiàn)來(lái)回滾動(dòng)的問(wèn)題。

mx:HSlide調(diào)節(jié)滑稈

這個(gè)控件在本例中2處使用,實(shí)現(xiàn)對(duì)播放進(jìn)度和聲音大小的控制。最一開始調(diào)整播放進(jìn)度的問(wèn)題難倒了我很久,因?yàn)樵诟枨シ胚^(guò)程中HSlide要自動(dòng)滑動(dòng)當(dāng)前播放位置,同時(shí)又需要能手動(dòng)拖動(dòng)播放位置,HSlide本來(lái)有一個(gè)很好的change事件用來(lái)偵聽改變,但是我使用定時(shí)器設(shè)置HSlide的value的時(shí)竟然也給我觸發(fā)change事件,參考了Adobe哥官網(wǎng)的幫助文檔,說(shuō)是Slider 組件的值因鼠標(biāo)或鍵盤交互操作而改變時(shí)調(diào)度,如果 liveDragging 屬性是 true,則在用戶移動(dòng)滑塊時(shí)持續(xù)調(diào)度該事件。 如果 liveDragging 是 false,則在用戶釋放滑塊時(shí)調(diào)度該事件。但是無(wú)論我怎么設(shè)置,在代碼里改變了HSlide的value值怎會(huì)觸發(fā)change事件,不是說(shuō)在用戶交互操作而改變時(shí)調(diào)度嗎?無(wú)賴啊,后來(lái)只能折中采取監(jiān)聽thumbDrag滑稈拖動(dòng)時(shí)事件,這個(gè)事件Adobe哥的解釋是當(dāng)按下滑塊并隨后隨鼠標(biāo)移動(dòng)時(shí)調(diào)度,這樣會(huì)有一個(gè)小問(wèn)題,就是需要拖動(dòng)滑稈按下時(shí)才會(huì)觸發(fā),點(diǎn)擊無(wú)效。

SoundMixer.computeSpectrum()分析音頻曲線

本例你看到顯示的音頻曲線其實(shí)是右64個(gè)繪制成條狀的Canvas控件排列而成,然后使用定時(shí)器每間隔100毫秒重新設(shè)置他們的scaleY位置以呈現(xiàn)出變幻曲線的效果,代碼只有三行很簡(jiǎn)單,具體可參見我下面源碼給出的timerTick事件。這里為什么要用定時(shí)器呢?在網(wǎng)上看別人是監(jiān)聽Event.ENTER_FRAME事件重繪音頻曲線的,不想搞那么麻煩就直接用定時(shí)器了,隨便根據(jù)bytesTotal和bytesLoaded計(jì)算下歌曲播放時(shí)間,使用100毫秒的定時(shí)器也并好耗站資源,CPU沒(méi)有漲很高。

效果圖:

圖片一

mxml代碼如下:

代碼如下:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" verticalGap="0" scroll="false" backgroundAlpha="0"

horizontalScrollPolicy="off" verticalScrollPolicy="off" verticalAlign="middle" horizontalAlign="center"

initialize="init(event)" layout="vertical" fontSize="14" paddingLeft="0" paddingTop="0" paddingRight="0" paddingBottom="0" >

<mx:Script>

<![CDATA[

import mx.formatters.DateFormatter;

import mx.effects.SoundEffect;

import mx.events.SliderEvent;

import mx.core.SoundAsset;

import mx.controls.Alert;

import mx.managers.CursorManager;

import flash.media.*;

import flash.utils.Timer;

[Embed(source="images/cursor.gif")]

private var cursorHand : Class;//圖標(biāo)

private var xml:XML;

private var xmlPath:String = "/flex/bin-debug/song.xml";

private var currIndex : Number = 0;

private var song :Sound;

private var channel :SoundChannel;

private var position : Number = 0;

// 保存 512 個(gè)聲音波形的快照

private var bytes:ByteArray = new ByteArray();

// SoundBar 的個(gè)數(shù)

private var barNum:uint = 64;

// 保存所有 SoundBar 的引用

private var soundBars:Array = new Array();

//定時(shí)器

private var timer : Timer;

//Application的initialize初試化事件

private function init(event:Event):void

{

var loader:URLLoader = new URLLoader();

loader.load(new URLRequest(xmlPath));

loader.addEventListener(Event.COMPLETE,Xml_Complete);

timer = new Timer(100);

timer.addEventListener(TimerEvent.TIMER,timerTick);

var barWidth:Number = boxSoundBar.width*1.00/barNum;

// 初始化Canvas為音頻條,放入舞臺(tái)并加入數(shù)組

for (var i:uint = 0; i < barNum; i++) {

var soundBar:Canvas = new Canvas();

soundBar.width = barWidth;

soundBar.height = boxSoundBar.height;

soundBar.x = i * barWidth;

soundBar.y = 0;

var g:Graphics = soundBar.graphics;

g.lineStyle(1,0x6688AA,1);

g.beginGradientFill(GradientType.RADIAL,[0x33cc00,0x456628],[1,1],[0,255],null,SpreadMethod.REFLECT,InterpolationMethod.RGB,0);

g.drawRect(0,0,soundBar.width,soundBar.height);

g.endFill();

boxSoundBar.addChild(soundBar);

soundBars.push(soundBar);

}

// 隱藏一些內(nèi)建的鼠標(biāo)右鍵菜單項(xiàng)

this.contextMenu.hideBuiltInItems();

var contextMenuItem : ContextMenuItem = new ContextMenuItem("Powered By: Jonllen");

contextMenuItem.enabled = false;

contextMenu.customItems.push(contextMenuItem);

this.contextMenu.customItems.push(contextMenuItem);

//更改鼠標(biāo)圖標(biāo)

CursorManager.setCursor(cursorHand);

}

//讀取XML文件完成事件

private function Xml_Complete(event:Event):void

{

xml = new XML(event.target.data);

if(xml.item.length()>=1)

{

listSong.dataProvider= xml.item.name;

listSong.selectedIndex = 0;

//手動(dòng)觸發(fā)List的Change事件

listSong.dispatchEvent(new mx.events.ListEvent(Event.CHANGE, true, false));

}

}

//List選擇歌曲改變事件

private function Xml_Change(event:Event):void

{

currIndex = event.target.selectedIndex;

timer.stop();

//停止聲音文件的加載

if( song!=null )

{

//移除之前加載PROGRESS事件對(duì)songProgress進(jìn)度條的控制

song.removeEventListener(ProgressEvent.PROGRESS,songProgress_Change);

if( song.isBuffering )

song.close();

}

song = new Sound();

var url : String = xml.item[currIndex].url;

var source:URLRequest = new URLRequest(url);

song.load(source);

song.addEventListener(ProgressEvent.PROGRESS, songProgress_Change);

song.addEventListener(IOErrorEvent.IO_ERROR, songProgress_Error);

position = 0;

songStart();

}

//歌曲播放完成

private function songProgress_Complete(e:Event):void {

if(currIndex == xml.item.length()-1) {

currIndex = 0;

}else {

currIndex++;

}

listSong.selectedIndex = currIndex;

listSong.dispatchEvent(new mx.events.ListEvent(Event.CHANGE, true, false));

}

//加載歌曲失敗

private function songProgress_Error(e:IOErrorEvent):void {

Alert.show("文件不存在!","系統(tǒng)提示");

}

//開始播放歌曲

private function songStart():void {

if ( channel != null ){

channel.stop();

}

lblName.text = xml.item[currIndex].name;

channel = song.play(position,int.MAX_VALUE);

var length :Number = song.length*song.bytesTotal/song.bytesLoaded;

var date : Date = new Date();

date.time = length;

var dt : DateFormatter = new DateFormatter();

dt.formatString="NN:SS";

var totalTime : String = dt.format(date);

date.time = channel.position;

lblTime.text = dt.format(date) + " | " + totalTime;

lblStatus.text = "播放";

var soundcontrol : SoundTransform = channel.soundTransform;

soundcontrol.volume = volumeSlider.value;

channel.soundTransform= soundcontrol;

timer.start();

boxSoundBar.visible = true;

}

//停止歌曲播放

private function songStop():void {

timer.stop();

position = 0;

boxSoundBar.visible = false;

lblTime.text = "00:00 |"+lblTime.text.split("|")[1];

lblStatus.text = "停止";

songSlider.value = songSlider.minimum;

songProgress.setProgress(songProgress.minimum,songProgress.maximum);

if ( channel != null )

{

channel.stop();

}

}

//暫停歌曲播放

private function songPause():void {

if ( channel != null ){

timer.stop();

position = channel.position;

channel.stop();

lblStatus.text = "暫停";

}

}

//加載歌曲進(jìn)度條顯示

private function songProgress_Change(e:ProgressEvent):void {

var percent:int = Math.round(e.bytesLoaded * 100 / e.bytesTotal);

songProgress.setProgress(e.bytesLoaded,e.bytesTotal);

}

//定時(shí)器方法

private function timerTick( e:TimerEvent):void {

if( channel!=null) {

var length :Number = song.length*song.bytesTotal/song.bytesLoaded;

var date : Date = new Date();

date.time = length;

var dt : DateFormatter = new DateFormatter();

dt.formatString="NN:SS";

var totalTime : String = dt.format(date);

date.time = channel.position;

lblTime.text = dt.format(date) + " | " + totalTime;

songSlider.value=100*channel.position/length;

if( songSlider.value>=songSlider.maximum){

timer.stop();

songProgress_Complete(null);

return;

}

SoundMixer.computeSpectrum(bytes, false, 0);

for (var i:uint = 0; i < barNum; i++) {

soundBars[i].scaleY = bytes.readFloat();

}

}

}

//歌曲進(jìn)度調(diào)整事件

internal function songSlider_Change(e:SliderEvent):void{

timer.stop();

if ( channel != null ){

var length :Number = song.length*song.bytesTotal/song.bytesLoaded;

position = e.value*length/100;

songStart();

}

}

//聲音大小調(diào)整事件

internal function changeVolume(evt:SliderEvent):void{

if ( channel != null ){

var soundcontrol : SoundTransform = channel.soundTransform;

soundcontrol.volume = evt.value;

channel.soundTransform= soundcontrol;

}

}

//設(shè)置歌曲播放時(shí)間和總時(shí)間

private function setTimeStatus():void {

var length :Number = song.length*song.bytesTotal/song.bytesLoaded;

var date : Date = new Date();

date.time = length;

var dt : DateFormatter = new DateFormatter();

dt.formatString="NN:SS";

var totalTime : String = dt.format(date);

date.time = channel.position;

lblTime.text = dt.format(date) + " | " + totalTime;

}

]]>

</mx:Script>

<mx:HBox width="100%" verticalGap="0" verticalAlign="middle" horizontalAlign="center">

<mx:Canvas width="440" borderColor="#CCCCCC" borderStyle="solid" height="171">

<mx:Label id="lblName" x="5" fontSize="18" y="10" text=""/>

<mx:HBox id="boxSoundBar" horizontalGap="0" verticalAlign="middle"

width="192" height="50" x="5" y="39" visible="false"></mx:HBox>

<mx:ProgressBar id="songProgress" label=""

width="290" height="3" mode="manual" textAlign="left"

labelPlacement="center" fontSize="3" x="10" y="97"

minimum="0" maximum="100" barColor="yellow"

trackColors="[white, haloSilver]"/>

<mx:HSlider id="songSlider" styleName="song" value="0"

showTrackHighlight="true" x="5" y="85" thumbDrag="songSlider_Change(event)"

width="300" height="22" minimum="0" maximum="100"

liveDragging="false" snapInterval="1" toolTip="拖動(dòng)調(diào)整播放進(jìn)度">

</mx:HSlider>

<mx:Label id="lblStatus" x="243" y="41" text=""/>

<mx:Label id="lblTime" x="205" y="66" text="00:00 | 5:23"/>

<mx:Button x="10" y="124" label="Play" click="songStart()"/>

<mx:Button x="74" y="124" label="Pause" click="songPause()"/>

<mx:Button x="152" y="124" label="Stop" click="songStop()"/>

<mx:HSlider id="volumeSlider" styleName="volume" change="changeVolume(event)"

showTrackHighlight="true" value="0.5" x="222" y="133"

width="81" minimum="0" maximum="10" liveDragging="true"

snapInterval="0.1" toolTip="音量調(diào)節(jié)" />

<mx:Label x="308" fontSize="18" y="10" text="歌曲列表"/>

<mx:List id="listSong" alpha="0.25" x="308" y="43" height="116"

change="Xml_Change(event)" width="130" toolTip="點(diǎn)擊選擇歌曲"></mx:List>

</mx:Canvas>

</mx:HBox>

</mx:Application>

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
上一篇:什么是web2.0?
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn)

版權(quán)所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
午夜精品福利视频网站 | 色婷婷av一区二区| 国产欧美日韩三级| 成人网在线播放| 亚洲精品国产精华液| 欧美猛男gaygay网站| 精品一区二区av| 中文字幕中文字幕在线一区 | 麻豆久久一区二区| 久久综合狠狠综合久久激情| 福利一区二区在线观看| 亚洲国产日日夜夜| 久久久久久久av麻豆果冻| 99国产精品一区| 欧美bbbbb| 亚洲另类春色国产| 精品成人一区二区三区| 色综合天天综合在线视频| 日本视频在线一区| 亚洲美女屁股眼交3| www国产精品av| 欧美色图12p| 丰满岳乱妇一区二区三区 | 亚洲动漫第一页| 中文字幕第一页久久| 欧美久久高跟鞋激| 色诱视频网站一区| 国产69精品久久99不卡| 午夜欧美一区二区三区在线播放| 国产清纯白嫩初高生在线观看91 | 一区在线播放视频| 日韩一区二区三免费高清| 成人午夜电影网站| 国产制服丝袜一区| 秋霞影院一区二区| 午夜精品福利久久久| 国产精品电影一区二区三区| 久久综合色一综合色88| 欧美高清你懂得| 欧美亚洲一区二区在线| 成人爽a毛片一区二区免费| 久久草av在线| 久久99日本精品| 裸体健美xxxx欧美裸体表演| 婷婷综合另类小说色区| 亚洲激情综合网| 亚洲精品国产品国语在线app| 国产精品日韩精品欧美在线| 日本一区二区三区视频视频| 国产欧美一二三区| 国产亚洲精品久| 国产亚洲一区二区在线观看| 久久久精品免费观看| 2022国产精品视频| 久久久久9999亚洲精品| 国产亚洲欧美日韩在线一区| 欧美国产欧美综合| 国产精品久久久久久久久免费桃花 | 久久久五月婷婷| 国产肉丝袜一区二区| 中文字幕欧美日本乱码一线二线 | 亚洲主播在线播放| 亚洲国产aⅴ天堂久久| 一区二区国产视频| 午夜一区二区三区视频| 日韩二区在线观看| 精品系列免费在线观看| 国产ts人妖一区二区| 99精品视频中文字幕| 欧美日韩一区二区三区在线| 欧美一区二区视频网站| 久久精品一二三| 日韩一区中文字幕| 亚洲国产视频网站| 九色|91porny| 91视频在线观看免费| 欧美高清一级片在线| 久久久久久日产精品| 亚洲日本va在线观看| 秋霞影院一区二区| 99久久er热在这里只有精品66| 欧美日韩国产首页| 久久综合九色综合欧美亚洲| 亚洲欧美自拍偷拍色图| 日本午夜一本久久久综合| 粉嫩嫩av羞羞动漫久久久| 欧美三级三级三级爽爽爽| 精品国产伦一区二区三区观看体验| 中文字幕视频一区| 美女看a上一区| 在线视频一区二区三| 久久久精品免费免费| 亚洲一区二区在线播放相泽| 国产伦精品一区二区三区免费| 欧美亚洲国产一区在线观看网站| 久久色在线视频| 午夜视频一区在线观看| 成人午夜私人影院| 久久综合久久综合久久综合| 偷拍亚洲欧洲综合| 日本道色综合久久| 中文字幕第一区综合| 久草这里只有精品视频| 欧美美女黄视频| 亚洲蜜臀av乱码久久精品蜜桃| 国产成人精品免费在线| 日韩欧美国产麻豆| 亚欧色一区w666天堂| 97精品国产露脸对白| 久久综合久久久久88| 美女视频黄免费的久久| 欧美日韩一区二区三区视频| 综合在线观看色| zzijzzij亚洲日本少妇熟睡| 久久精品视频网| 国内精品写真在线观看| 日韩美女天天操| 日韩激情av在线| 在线播放/欧美激情| 亚洲成a人在线观看| 欧美伊人久久久久久久久影院 | 在线观看91视频| 欧美高清在线一区| 国产91富婆露脸刺激对白| 久久久噜噜噜久噜久久综合| 国产一区二区影院| 久久婷婷色综合| 成人综合婷婷国产精品久久| 欧美激情艳妇裸体舞| 成人黄动漫网站免费app| 国产精品免费看片| 成人黄页毛片网站| 亚洲人成精品久久久久久| 99久久国产综合精品色伊| 亚洲精品视频自拍| 欧美日韩精品一区视频| 免费一级欧美片在线观看| 欧美tk—视频vk| 国产成人精品综合在线观看| 国产清纯在线一区二区www| 国产成人av网站| 亚洲欧美日韩在线| 欧美日本国产一区| 精品夜夜嗨av一区二区三区| 中文字幕av免费专区久久| 色婷婷久久久久swag精品| 日本亚洲三级在线| 中文欧美字幕免费| 欧美日韩综合色| 国产精品一区二区在线播放| 自拍偷拍亚洲欧美日韩| 7777精品伊人久久久大香线蕉完整版 | 国产成人av一区二区三区在线| 国产精品久久久久婷婷| 欧美午夜片在线看| 久久精品国产77777蜜臀| 中文字幕第一页久久| 欧美午夜精品理论片a级按摩| 九一九一国产精品| 亚洲欧美日韩一区| 精品国产污污免费网站入口| 福利一区福利二区| 一区二区欧美国产| 久久综合狠狠综合| 欧美日韩一区二区三区高清| 国产精品77777| 午夜久久久久久电影| 亚洲国产精品成人综合色在线婷婷| 欧美午夜不卡在线观看免费| 国产一区二区h| 视频在线在亚洲| 1000部国产精品成人观看| 日韩欧美在线影院| 91丝袜国产在线播放| 韩国精品主播一区二区在线观看| 一区二区三区成人| 久久精品免视看| 欧美成人一级视频| 欧美日韩二区三区| 色婷婷久久综合| av福利精品导航| 国产一区在线观看麻豆| 日韩福利视频导航| 午夜精品久久久久久久| 18涩涩午夜精品.www| 国产色一区二区| 欧美不卡一区二区三区四区| 欧美日韩国产一级| 欧美亚洲日本国产| 91成人在线精品| 国产成人小视频| 国产福利一区二区三区视频在线| 天天亚洲美女在线视频| 亚洲一区欧美一区| 夜夜爽夜夜爽精品视频| 亚洲少妇最新在线视频| 成人欧美一区二区三区1314| 中文字幕亚洲在| 亚洲欧美视频一区| 亚洲免费成人av|