花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 84|回复: 17

在canvas画布上用线条做频谱播放器

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2022-8-21 14:10 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    代码及解释如下:
    1. <style>
    2. #canv { position: absolute; cursor: pointer; }
    3. </style>

    4. <canvas id="canv"></canvas>

    5. <script>
    6. let ctx = canv.getContext('2d'), //画笔
    7.         w = canv.width = 80, //画布宽度
    8.         h = canv.height = 60, //画布高度
    9.         lines = [], //线条数组
    10.         total = 10, //线条总数
    11.         lineWidth = (w - 2 * total) / total, //线条厚度
    12.         aud = new Audio(); //播放器

    13. aud.src = 'https://music.163.com/song/media/outer/url?id=16434054.mp3'; //音乐地址
    14. aud.loop = true; //循环播放
    15. aud.autoplay = true; //自动播放

    16. aud.addEventListener('timeupdate', change); //监听播放进度 :驱动频谱
    17. canv.onclick = () => aud.paused ? aud.play() : aud.pause(); //画布单击事件 :控制暂停、播放

    18. //创建线条对象 :以便批量处理
    19. function Line(x1,y1,x2,y2) {
    20.         this.x1 = x1;
    21.         this.y1 = y1;
    22.         this.x2 = x2;
    23.         this.y2 = y2;
    24.         lines.push(this); //加入 lines 数组
    25. }

    26. //线条对象的绘制函数
    27. Line.prototype.draw = function() {
    28.         ctx.beginPath(); //开启路径
    29.         ctx.strokeStyle = this.color; //绘制颜色
    30.         ctx.lineWidth = lineWidth; //画笔粗细 :等于线条厚度
    31.         ctx.moveTo(this.x1, this.y1); //移动画笔到 x1、y1位置
    32.         ctx.lineTo(this.x2,this.y2); //绘制线条到 x2、y2
    33.         ctx.stroke(); //上色
    34. }

    35. // 批量生成并绘制线条
    36. for(let j = 0; j < total; j ++) { //按预设线条总数
    37.         let line = new Line(); //建立Line对象实例 line
    38.         line.x1 = j * lineWidth + j*2 + lineWidth / 2 + 1; //实例 line 的x1 :其算法令每个线条拉开一定距离
    39.         line.y1 = h; //y1等于画布高度
    40.         line.x2 = line.x1; //x2等于x1
    41.         line.y2 = 50; //y2 :这个值后面会动态变化,这里是为不支持自动播放准备一个统一的高度
    42.         line.color = '#' + Math.random().toString(16).substr(-6); //首次出现的随机颜色:后面还会变化
    43.         line.draw(); //绘制线条
    44. }

    45. //线条动态变化函数
    46. function change() {
    47.         ctx.clearRect(0,0,canv.width,canv.height); //每次刷新清除一次画布
    48.         for(let item of lines) { //线条数组每个元素
    49.                 item.color = '#' + Math.random().toString(16).substr(-6); //随机得到16进制颜色
    50.                 item.y2 = h - (Math.random() * h); //y2随机值 :高度减去(0至0.999...)*高度
    51.                 item.draw(); //绘制线条
    52.         }
    53. }
    54. </script>
    复制代码


    评分

    参与人数 3威望 +110 金钱 +220 经验 +110 收起 理由
    加林森 + 30 + 60 + 30 很给力!
    醉美水芙蓉 + 30 + 60 + 30 赞一个!
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-21 14:13 | 显示全部楼层
    本帖最后由 马黑黑 于 2022-8-22 21:43 编辑

    效果如下。说明:由于有些浏览器设置问题,不支持媒体的自动播放,若此,此播放器仅凭监听 timeupdate 事件驱动频谱会有问题,播放器不会出现。故此,我们需要首次运行一次函数 change() ,可以放在 JS 代码的最后一行:

    change();

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-21 14:24 | 显示全部楼层
    如果需要倒影,可在 #canv {} 加入:

    -webkit-box-reflect: below 0 linear-gradient(transparent, transparent 50%, rgba(255,255,255,.3));

    但火狐至今仍不支持 box-reflect
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-21 18:34 | 显示全部楼层
    画布也能做频谱播放器,这个好
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-21 18:52 | 显示全部楼层
    红影 发表于 2022-8-21 18:34
    画布也能做频谱播放器,这个好

    这个也不用担心背景问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-21 18:54 | 显示全部楼层
    line.x1 = j * lineWidth + j*2 + lineWidth / 2 + 1; 这个没看懂,为什么是这样的算法?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-21 20:03 | 显示全部楼层
    本帖最后由 马黑黑 于 2022-8-21 20:07 编辑
    红影 发表于 2022-8-21 18:54
    line.x1 = j * lineWidth + j*2 + lineWidth / 2 + 1; 这个没看懂,为什么是这样的算法?

    这个算法,基于x1,就是画笔要画一根线条前移动到的位置,也是线条的起始{x,y}坐标值的x值。

    线是横向排列的。线有厚度,所以,① 基于起点X坐标,第 j 根线必须在 j*lineWidth;② 我想每根线拉开一定距离,且头尾两根线不贴合边缘,那么,根据前面 lineWidth 的定义,即(画布宽度 - 2 * 线条总数)/线条总数 的定义,再加 j*2 + lineWidth / 2 + 1。如此,便能均匀地把 total 根线横向安置在画布里。不这样做处理,线条会挤在一起,甚至会在同一个地方重复画线条。

    这是算法,有些算法是根据上下文进行具体应对的。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

    回复 支持 反对

    使用道具 举报

    醉美水芙蓉 该用户已被删除
    发表于 2022-8-21 20:09 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-21 20:17 | 显示全部楼层
    醉美水芙蓉 发表于 2022-8-21 20:09
    欣赏学习黑黑老师新教材!

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-15 10:31
  • 签到天数: 525 天

    [LV.9]以坛为家II

    1383

    主题

    3万

    回帖

    10万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹花好月圆飞龙在天王者至尊大将风范天籁妙音共看流星风雨同行幸福快乐喜乐安康指尖上的流年花潮版主

    发表于 2022-8-22 09:18 | 显示全部楼层
    学习学习
     
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-22 16:19 | 显示全部楼层
    马黑黑 发表于 2022-8-21 20:03
    这个算法,基于x1,就是画笔要画一根线条前移动到的位置,也是线条的起始{x,y}坐标值的x值。

    线是横向 ...

    嗯,怪不得线宽的取值也用了算法,而不是直接赋值。谢谢黑黑解答
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-22 17:03 | 显示全部楼层
    红影 发表于 2022-8-22 16:19
    嗯,怪不得线宽的取值也用了算法,而不是直接赋值。谢谢黑黑解答

    不考虑画布尺寸的话,也可以直接赋值的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-22 21:10 | 显示全部楼层
    马黑黑 发表于 2022-8-22 17:03
    不考虑画布尺寸的话,也可以直接赋值的

    如果直接复制,后面的间隔的算法也要更改了吧?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-22 21:31 | 显示全部楼层
    红影 发表于 2022-8-22 21:10
    如果直接复制,后面的间隔的算法也要更改了吧?

    一般来说总要有个算法,像x1,它是排列线条的依据,每根线条必须在前一根的右边不远处。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-23 15:52 | 显示全部楼层
    马黑黑 发表于 2022-8-22 21:31
    一般来说总要有个算法,像x1,它是排列线条的依据,每根线条必须在前一根的右边不远处。

    嗯嗯,否则就无法均匀排布了。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-23 17:24 | 显示全部楼层
    红影 发表于 2022-8-23 15:52
    嗯嗯,否则就无法均匀排布了。

    是的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-8-23 21:12 | 显示全部楼层

    等消暑完了,我也来学做个
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-8-23 21:12 | 显示全部楼层
    红影 发表于 2022-8-23 21:12
    等消暑完了,我也来学做个

    挺好
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 22:55 , Processed in 0.080301 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表