JS Canvas实现QQ未接通电话动画特效
本文介绍如何使用HTML5 Canvas和JavaScript实现类似QQ未接通电话时的动画特效。通过解析贝塞尔曲线原理,利用Canvas坐标系特性,结合定时器与图形保存恢复机制,绘制出流畅的声波动画效果。
QQ未接通电话动画特效展示
首先展示一下最终的特效演示。视频由手机直接录制,画质可能不够清晰,敬请谅解。

原本计划制作腾讯贝塞尔曲线下拉刷新效果,但在与朋友进行QQ通话时,观察到未接通状态下的动画设计,由此萌生了复现该动画的想法。
在实现过程中,需要特别注意以下关键点:
当Canvas中心点经过变换移至Canvas正中心后,需注意坐标系的差异:Canvas的Y轴方向是从上到下由负变正(-,+);而数学坐标系中Y轴从上到下是由正变负(+,-)。
HTML结构实现
首先查看HTML代码部分。代码非常简洁,仅包含一个基本的Canvas元素,未进行其他复杂操作。
HTML代码
<canvas id="canvas1" width="500" height="500"></canvas>
JS代码
JavaScript核心逻辑与注意事项
var paint, r; //设置画笔和半径
var width, height; //获得canvas的长度和宽度
var count = 0; //设置正铉曲线的便宜量
var colors = ["#66ccff", "#ff0000"];
/*程序入口*/
function main() {
var canvas1 = document.getElementById("canvas1");
paint = canvas1.getContext("2d");
width = paint.canvas.width;
height = paint.canvas.height;
r = width / 2;
start();
setInterval(start, 200);
}
/*开始进行清除和绘制*/
function start() {
paint.clearRect(0, 0, width, height);
drawXY();
drawSin();
paint.restore();
}
/*绘制一个坐标系*/
function drawXY() {
paint.save();
paint.translate(r, r);
paint.beginPath();
paint.lineWidth = 1;
paint.moveTo(0, -r);
paint.lineTo(0, r);
paint.stroke();
paint.lineWidth = 1;
paint.moveTo(-r, 0);
paint.lineTo(r, 0);
paint.stroke();
}
/*正弦曲线可表示为y=Asin(ωx+φ)+k,定义为函数y=Asin(ωx+φ)+k在直角坐标系上的图象,*/
/*绘制sin正弦图像*/
function drawSin() {
paint.save();
count++;//设置每一刻的偏移量
var i, j, rad, y;
for (j = 0; j < 2; j++) {
for (i = -1000; i < 1000; i++) {
paint.beginPath();
paint.strokeStyle = colors[j];
rad = i * Math.PI / 180;
y = -20 * Math.sin(rad - (count + j));
paint.arc(i, y, 0.3, 0, 2 * Math.PI, false);
paint.stroke();
}
}
paint.restore();
}
JavaScript部分的关键在于:在通过计时器动态改变图像时,必须先执行清除操作。随后,必须对绘制过的图像进行保存和恢复处理,否则程序可能出现图像重叠或无法显示等Bug。
此处定义的paint变量名是沿用了Android绘图的习惯命名方式。
以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家多多支持本站。
js-cookie 安装与基础用法:set、get、remove 详解
2026-11-05 16:35:06
适合JavaScript初学者的实战项目:制作简易待办事项列表
2026-11-05 16:17:07
JS打开新标签页时怎么通过URL传递参数
2026-11-05 12:21:08
sigma.js 自定义节点样式:设置颜色、大小及标签显示的技巧
2026-11-05 09:55:00
JS 生成的统计图怎么导出为 PNG 图片或 PDF 文件?
2026-11-05 09:37:58
