canvas离屏、旋转效果实践——旋转的雪花
效果展示
理论基础——“常见的canvas优化——模糊问题、旋转效果”
用离屏canvas画基础部分
1、封装画线函数
function drawLine(ctx,x1,y1,x2,y2,color){
ctx.save();
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
ctx.restore();
}
2、画雪花的六条线
function canvasSingleSnow(snowSize){
var singleSnow = document.createElement('canvas');
var ctxSingle = singleSnow.getContext('2d');
singleSnow.setAttribute('width', snowSize * 2);
singleSnow.setAttribute('height', snowSize * 2);
ctxSingle.translate(snowSize, snowSize);//定位原点到画布中心
for(var i = 0; i < 6; i++){//画六条线
ctxSingle.save();
ctxSingle.rotate(Math.PI*2 * i/6);
drawLine(ctxSingle, 0, 0, snowSize, 0,"#656565");
ctxSingle.restore();
}
return singleSnow;
}
首先这里用到了离屏canvas,我们通过传参的方式确定离屏canvas的尺寸,是为了尽可能避免canvas图案缩放导致的显示效果问题。
另外这里for循环中用到了canvas的旋转效果,所以我们可以很轻易的画出6条有角度的线。效果如下图所示
3、画出完整的雪花
function drawCanvasSnow(centerSnow){
var canvasSnow = document.createElement('canvas');
var ctxSnow = canvasSnow.getContext('2d');
canvasSnow.setAttribute('width', centerSnow * 2);
canvasSnow.setAttribute('height', centerSnow * 2);
//画一个大雪花
var bigSnow = canvasSingleSnow(centerSnow);
ctxSnow.drawImage(bigSnow, 0, 0, bigSnow.width, bigSnow.height,
0, 0, centerSnow * 2, centerSnow * 2);
//画六个小雪花
var smallSnow = canvasSingleSnow(centerSnow/3);
var sizeSnow = centerSnow * 3/5;//小雪花的尺寸(直径)
var rSnow = centerSnow - sizeSnow/2;//小雪花的位置(离大雪花中心的距离)
for(var i = 0; i < 6; i++){
ctxSnow.save();
ctxSnow.translate(centerSnow, centerSnow);
ctxSnow.rotate(Math.PI*2 * i/6);
ctxSnow.drawImage(smallSnow, 0, 0, smallSnow.width, smallSnow.height,
rSnow - sizeSnow/2, -sizeSnow/2, sizeSnow, sizeSnow);
ctxSnow.restore();
}
return canvasSnow;
}
上述代码中尺寸部分说明:小雪花的尺寸比大雪花小,用比例可以方便缩放;小雪花的位置则固定在大雪花六条线的端点处。效果如下图所示
将离屏canvas作为资源画到实际显示的canvas上
1、封装一个根据旋转加载离屏canvas的函数
//r为雪花图案中心距画布中心的距离
//angle为雪花图案在画布上的安放角度
//size为雪花图案的显示尺寸
function drawSnowAngle(ctx,r,angle,size){
ctx.save();
ctx.rotate(Math.PI*2 * angle);
drawLine(ctx,0,0,r,0,"#656565");
ctx.drawImage(canvasSnow, 0, 0, canvasSnow.width, canvasSnow.height,
r - size/2, -size/2, size, size);
ctx.restore();
}
2、可以将离屏canvas画的雪花图案画到实际显示的canvas上了
//center为实际显示canvas的画布中心(半径)
//rSnow为雪花图案的半径
drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2);
3、加上动态旋转效果
var snowNum = 1;
var isAdd = true;
var loop = setInterval('drawCanvas()', 10);//定时器,每10ms绘制一次
function drawCanvas(){
//设置旋转效果
if(snowNum >= 18){isAdd = false;}//最大个数为18
else if(snowNum <= 1){isAdd = true;}//最小个数为1
if(isAdd){snowNum += snowNum/200;}//达到最大后开始递减
else{snowNum -= snowNum/100;}//达到最少后开始递增
//画图
var rSnow = center/2 * (snowNum - 6)/6;//设置雪花图案显示尺寸
canvasSnow = drawCanvasSnow(rSnow);//画出离屏雪花图案
ctx.clearRect(-center, -center, center * 2, center * 2);//清除画布
for(var i = 0; i < snowNum; i++){//开始画图
drawSnowAngle(ctx, center - rSnow, i/snowNum, rSnow * 2);
}
}
旋转的雪花就这样完成了。效果见文章开头的效果展示链接
canvas离屏、旋转效果实践——旋转的雪花的更多相关文章
- HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图)
原文:HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图) 3d旋转图:主要用css3中transform属性中的rotate,translate;以及用来做舞台效果的 pers ...
- html5 canvas首屏自适应背景动画循环效果代码
模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...
- canvas离屏技术与放大镜实现
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)canvas 离屏技术与放大镜实现. 更多讨论或者错误提交,也请移步. 利用canvas除了可以实现 ...
- Canvas清屏的实现
/** * Canvas清屏的操作 * * 參考资料: http://blog.csdn.net/lfdfhl/article/details/9076001 * */ private void cl ...
- 【HTML】html5 canvas全屏烟花动画特效
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- canvas绘图基础及基于粒子系统的雪花飘落
canvas是html中的一个元素,可以通过js操控绘图! 可以绘制各种图形,各种填充样式! 绘制时可以进行旋转,缩放,平移,但并不是很灵活! 有一对比较好用的方法是save restore! sav ...
- ios手机竖屏拍照图片旋转90°问题解决方法
手机拍照会给图片添加一个Orientaion信息(即拍照方向),如下: 用ios手机拍照,系统会给图片加上一个方向的属性, ios相机默认的拍照方向是后摄Home键在右为正,前摄Home键在左为正. ...
- 虚幻引擎4笔记20160821 - 使用GPU粒子做雪花旋转镜头雪花忽有忽无的问题
在使用GPU进行雪花制作的时候,雪花总是在镜头旋转的时候,一会有,一会无的情况,后来下载别人的例子才知道,原来要给粒子加上边界,具体解决方法如下图
- 使用canvas实现超绚丽的旋转正方形
自己无意中的一个小"bug",却让动画变得超绚丽= = 所以,不要害怕出bug,谁知道bug不会开出一朵绚丽的花呢? <!DOCTYPE html> <html ...
随机推荐
- Python数据类型的if判断
Python数据类型的if判断 1.字符串判断 # -*- coding: utf-8 -*- ''' @Time : 2021/12/13 15:56 @Author : ziqingbaojian ...
- JZ-032-把数组排成最小的数
把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...
- LeetCode-073-矩阵置零
矩阵置零 题目描述:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不 ...
- Visual Studio双击打开项目而不是项目属性文件
从VS2019版本就默认勾选了这个,每次打开都是到属性文件,这个根本用不到,点击小三角又比较麻烦,不知道为啥微软给了这个默认功能 VS2022 Preview也是,默认勾选 勾选如下即可:
- 动态线程池(DynamicTp)之动态调整Tomcat、Jetty、Undertow线程池参数篇
大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数 ...
- 微服务从代码到k8s部署应有尽有系列(十三、服务监控)
我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...
- linux下更改文件字符格式为uft-8
liunx下发布的.net Core 程序,发现短信签名不错误不能发出.后来检查发现配配文件中的字符为乱码才知道是因为字符格式问题. 因为服务器批较多,还是使用命令来解决比较快.使用iconv来更改. ...
- Applied Social Network Analysis in Python 相关笔记3
如果是option2的话,答案选A. 这里节点s,从左边的选择,节点t从右边选择. 这里计算还是用以前的值,不用更新过的值.
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- LGP2726题解
当初 mark 这道题还是因为看到是黑,感觉比较水,然后它现在掉紫了. 不过这题题解居然满了,写一篇给自己看吧. 首先我们有一个思路,就是割掉一条边,然后分别求两颗树的重心. 等等,这好像是CSP原题 ...