Canvas 带有自定义音频播放器洗涤器/波形的遮罩帮助
Canvas Mask Help w/ custom audio player scrubber / waveform
我有两张png,一张白色,一张红色。
<img class="rangeHorizontal" id="seek" src="http://i.imgur.com/hRHH9VO.png">
<img id="seekFill" src="http://i.imgur.com/WoJggN0.png">
当歌曲不播放时它应该是白色的,而当歌曲正在播放时它应该随着歌曲的进行而填充红色,并且分别在向后和向前滑动时。
除 Canvas 部分外,我已经能够应付大部分播放功能。
目前这两个 png 相互叠加,当歌曲播放整个红色 png 叠加在上面时,.. 而不是只显示一部分,.. 很难解释,但我有一个 fiddle 让事情变得更清晰。
https://jsfiddle.net/tallgirltaadaa/q9qgyob0/
想要这样的播放器效果,也是用了两个png的方法:
如果有人能帮我一点忙,我会很高兴的。我一直在屏蔽并尝试使用 canvas 整个上午,但没有成功。
要完成的代码有点多,但这里有一种技术可以用来绘制图像的剪辑版本。根据需要实施 -
实例
在每个 timeupdate
:
- Canvas 已清除
- 画了白底图(可以任意缩放)
- 计算进度(当前时间/持续时间)
- 红色顶部图像是使用裁剪参数绘制的:
即
ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
完整示例代码(由于 API 用法,不得不替换音乐)-
var imgBg = new Image(),
imgFg = new Image(),
count = 2;
imgBg.onload = imgFg.onload = init;
imgBg.src = "http://i.imgur.com/hRHH9VO.png";
imgFg.src = "http://i.imgur.com/WoJggN0.png";
function init() {
if (--count) return; // makes sure both images are loaded
var canvas = document.querySelector("canvas"),
ctx = canvas.getContext("2d"),
audio = document.querySelector("audio");
canvas.width = imgBg.naturalWidth;
canvas.height = imgBg.naturalHeight;
render();
audio.volume = 0.5;
audio.addEventListener("timeupdate", render);
function render() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(imgBg, 0, 0);
// calc progress
var pst = audio.currentTime / audio.duration;
// draw clipped version of top image
if (pst > 0) {
ctx.drawImage(imgFg, 0, 0, (canvas.width * pst)|0, canvas.height, // source
0, 0, (canvas.width * pst)|0, canvas.height); // dst
}
}
}
body {background:#ccc}
canvas {width:600px;height:auto}
<audio src="https://raw.githubusercontent.com/epistemex/free-music-for-test-and-demo/master/music/kf_colibris.mp3" controls></audio>
<canvas></canvas>
我有两张png,一张白色,一张红色。
<img class="rangeHorizontal" id="seek" src="http://i.imgur.com/hRHH9VO.png">
<img id="seekFill" src="http://i.imgur.com/WoJggN0.png">
当歌曲不播放时它应该是白色的,而当歌曲正在播放时它应该随着歌曲的进行而填充红色,并且分别在向后和向前滑动时。
除 Canvas 部分外,我已经能够应付大部分播放功能。
目前这两个 png 相互叠加,当歌曲播放整个红色 png 叠加在上面时,.. 而不是只显示一部分,.. 很难解释,但我有一个 fiddle 让事情变得更清晰。
https://jsfiddle.net/tallgirltaadaa/q9qgyob0/
想要这样的播放器效果,也是用了两个png的方法:
如果有人能帮我一点忙,我会很高兴的。我一直在屏蔽并尝试使用 canvas 整个上午,但没有成功。
要完成的代码有点多,但这里有一种技术可以用来绘制图像的剪辑版本。根据需要实施 -
实例
在每个 timeupdate
:
- Canvas 已清除
- 画了白底图(可以任意缩放)
- 计算进度(当前时间/持续时间)
- 红色顶部图像是使用裁剪参数绘制的:
即
ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
完整示例代码(由于 API 用法,不得不替换音乐)-
var imgBg = new Image(),
imgFg = new Image(),
count = 2;
imgBg.onload = imgFg.onload = init;
imgBg.src = "http://i.imgur.com/hRHH9VO.png";
imgFg.src = "http://i.imgur.com/WoJggN0.png";
function init() {
if (--count) return; // makes sure both images are loaded
var canvas = document.querySelector("canvas"),
ctx = canvas.getContext("2d"),
audio = document.querySelector("audio");
canvas.width = imgBg.naturalWidth;
canvas.height = imgBg.naturalHeight;
render();
audio.volume = 0.5;
audio.addEventListener("timeupdate", render);
function render() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(imgBg, 0, 0);
// calc progress
var pst = audio.currentTime / audio.duration;
// draw clipped version of top image
if (pst > 0) {
ctx.drawImage(imgFg, 0, 0, (canvas.width * pst)|0, canvas.height, // source
0, 0, (canvas.width * pst)|0, canvas.height); // dst
}
}
}
body {background:#ccc}
canvas {width:600px;height:auto}
<audio src="https://raw.githubusercontent.com/epistemex/free-music-for-test-and-demo/master/music/kf_colibris.mp3" controls></audio>
<canvas></canvas>