1. 程式人生 > >html5 Audio音樂播放器(canvas圓形音樂播放進度條)(一)

html5 Audio音樂播放器(canvas圓形音樂播放進度條)(一)

html5 Audio音樂播放器(canvas圓形音樂播放進度條)

主要用到的是 audio 和canvas,我們下來介紹下著來年哥哥標籤以及它們的api:

  1. audio
屬性 屬性值 註釋
src url 播放音樂的url地址
preload load/auto 預載入
loop loop 迴圈播放
controls controls 是否顯示預設的控制按鈕
autoplay autoplay 自動播放

各大瀏覽器對音樂格式的支援情況

音訊格式 Chrome Firefox IE9 Opera Safari
OGG 支援 支援 支援
MP3 支援 不支援 支援
WAV 不支援 支援 不支援

屬性

屬性 Chrome Firefox
duration 獲取媒體檔案的總時長,以秒(S)為單位,如果無法獲取返回NaN
paused 如果媒體檔案被暫停,那麼paused屬性返回true,反之false
ended 如果媒體檔案播放完畢返回true
muted 用來獲取是否為靜音狀態,值為bool
volume 控制音量的屬性,值為0-1;0 為最小,1為最大
startTime 返回起始的播放時間
error 返回錯誤的程式碼,額uull的時候為正常,否則可以通過Music.error.code來獲取具體繁榮錯誤程式碼:
currentTime 用來獲取或者控制當前的播放時間,單位是秒(S)
currentSrc 以字串的形式返回正在播放或者已經載入的檔案
函式 作用
load() 載入音訊,視訊
play() 播放
pause() 暫停播放
canPlayType() 測試是否支援給定型別檔案

常用的事件

事件名稱 事件作用
loadstart 客戶端開始請求資料
progress 客戶端正在請求資料,緩衝
play
pause
ended
timeupdate 當前播放時間發生改變的時候
canplaythrough 歌曲已經載入完全
canplay 緩衝至目前可播放的狀態

2.canvas

方法 描述
fill() 填充當前繪圖(路徑)
stroke() 繪製已定義的路徑
beginPath() 起始一條路徑,或重置當前路徑
moveTo() 把路徑移動到畫布中的指定點,不建立線條
closePath() 建立從當前點回到起始點的路徑
lineTo() 新增一個新點,建立從該點到最後指定點的線條
clip() 從原始畫布剪下任意形狀和尺寸的區域
quadraticCurveTo() 建立二次貝塞爾曲線
bezierCurveTo() 建立三次方貝塞爾曲線
arc() 建立弧/曲線(用於建立圓形或部分圓)
translate 重新定義座標系

3 建立一個audio標籤 和canvas標籤,如下:

<audio id="music" src="wuding.mp3" controls="controls" preload="auto">
    Your browser does not support the audio element.
</audio>
<canvas id="canvas"></canvas>

4 用js控制canvas畫圓


    var music = document.getElementById('music');
    //繫結timeupdate事件
    music.addEventListener('timeupdate',function(){
        if (!isNaN(music.duration)) {
            var progressValue = music.currentTime/music.duration; //用時間比來獲取進度條的值
            if(progressValue == 1){
                progressValue=0;//當播放完成,進度條跳到開始
            }
            drawCircle(canvas,progressValue);

        };
    },false);
    drawCircle = function (canvas, percentage) {
        var clientWidth = document.documentElement.clientWidth;
        var canvasWidth = Math.floor(clientWidth * 200 / 750);
        var innerR = canvasWidth * 0.8 * 0.5;//半徑
        var ctx;
        canvas.setAttribute('width', canvasWidth + 'px');
        canvas.setAttribute('height', canvasWidth + 'px');
        if (canvas.getContext) {
            ctx = canvas.getContext('2d');
        }
        ctx.translate(canvasWidth / 2, canvasWidth / 2);
        ctx.beginPath();
        ctx.arc(0, 0, innerR, 0, Math.PI * 2, false);
        ctx.lineWidth = 10;
        ctx.strokeStyle = "#F0F0F0";
        ctx.stroke();
        ctx.beginPath();
        ctx.arc(0, 0, innerR, Math.PI * 3 / 2, (Math.PI * 3 / 2 + Math.PI * 2 / 180 + percentage * Math.PI * 2), false);
        ctx.lineWidth = 10;
        ctx.strokeStyle = "#EEBD44";
        ctx.stroke();
    };

    drawCircle(document.getElementById('canvas'),0);

5 效果圖如下:

這裡寫圖片描述

6 擴充套件,可以不需要自帶的預設播放控制元件,自己設計按鈕 或圖片的形式 來控制 音樂播放

7 問題:對於移動端頁面 要適配各種手機屏,對於手機適配的問題 我們經常用rem單位 來處理,但是canvas 不支援rem ,所以需要用js 獲取到客戶端的手機屏寬度 進行轉化,具體怎麼做,下次再講!