canvas雨滴绘制总结(三)
来源:互联网 发布:万信达软件官网 编辑:程序博客网 时间:2024/06/05 18:00
- 首先规划程序逻辑
- 2 如何用canvas绘制图形
- 3 怎么实现动画
- 4 雨滴绘制的原理
- 41 使用原型定义雨滴对象
- 42 视觉原理动画实现雨滴下落的绘制
- 5 绘制雨滴N个不能同时下落
- 问题一 Canvas宽高设置出现白边
- 问题二 Canvas具有默认大小 300px150px
- 问题三 Canvas自适应页面大小如何实现
- 问题四 雨滴绘制原理
- 问题五 setIntervalmoveRain100060
- 问题六 一个函数在没有指定调用主体前它的this永远指向window
1. 首先规划程序逻辑
##1.1 设置canvas款到与浏览器相同
1.1.1: 获取canvas元素
1.1.2: 获取浏览器宽高
1.1.3: 为canvas元素设置宽高
1.1.4:当窗口大小变化时,自动调整canvas大小
1.2. 如何用canvas绘制图形
1.2.1 绘制矩形
1.2.2 绘制圆形
1.2.3 绘制雨滴
1.2.4绘制落地后的水花
1.3 怎么实现动画
1.4 雨滴绘制的原理
1.4.1 使用原型定义雨滴对象
1.4.2 视觉原理,动画实现雨滴下落的绘制
1.5 绘制雨滴N个,不能同时下落
问题一 Canvas宽高设置出现白边
原因:canvas是内联元素,默认display:inline;
白边为行间距。
解决方案:display:block;
问题二 Canvas具有默认大小 300px*150px
问题三 Canvas自适应页面大小如何实现?
参考链接
方案一:CSS设置100%
body{margin:0;}html,body{ width:100%; height:100%;}#rain{ display:block; background-color:black; width:100%; height:100%; margin:0; }
结果:使用也可以实现自适应大小,但是改变页面大小时,雨滴的大小形状会变形。
原因:
将canvas按img理解,canvas样式宽高改变了,但是canvas自身的宽高却不变。当两者的宽高比例不同时,出现内容拉伸。
自适应是指元素的dispaly size缩放,是CSS布局维度(css layout dimension)自适应。而canvas的width/height属性对应的是画布内的coordinate space,不属于css负责.canvas的显示大小可以由css规则指定,但是其内部元素的像素不对应CSS像素或屏幕物理像素进行缩放显示。
方案二:使用JS获取window宽高,为canvas设置
原理:使用样式的宽高比重新设置画布的宽高比。发生重绘。
//1.1 获取canvas元素,只能用id var can=document.getElementById("rain");//1.2 浏览器的宽高存放在windows的全局变量 var w=window.innerWidth; var h=window.innerHeight;//1.3 设置canvas宽高 can.width=w; can.height=h;//1.4 当窗口大小变化时,自动调整canvas大小 //监控浏览器宽高变化 window.onresize=function(){ w=window.innerWidth; h=window.innerHeight; //1.3 设置canvas宽高 can.width=w; can.height=h; }
问题四 雨滴绘制原理
视觉原理:同样大小的矩形,从远处看,亮的(偏白)看起来比暗的更大。
绘制:
方案一:绘制不同透明度的矩形进行拼接。
方案二:对于一种rgb的矩形,覆盖层数不等的一种rgba整体页面。
方案二更加便于实现。
问题五 setInterval(moveRain,1000/60);
1. satInterval不写函数本体,2. 函数体内不能写setInterval3. 16ms所有的4. 在第0秒就执行moveRain,隔16ms再执行一次,5. 然而此时rainArray还没有内容,因为创建雨滴是相隔200ms创建一次6. 进而移动函数mobeRain中无操作对象7. 尽量不用setInterval8. JS发现此语句,插入到栈中,间隔执行,无论其他函数怎样运行9. 缺点:(1)丢帧 ,当callback函数运行时间太长超过setInterval间隔时(2)运行主体 window this指向问题
问题六 一个函数在没有指定调用主体前,它的this永远指向window。
/*封装框架时,this的指向,上下文,作用域 var obj={ num:1, add:function(){ this.num++; console.log(this.num); /* function(){ console.log(this.num);//此处this为window })();//运行obj.add()输出为UNDEFINED) */ (function(){ console.log(this.num); }.bind(this))();//运行obj.add()输出为UNDEFINED ;bind(this)之后输出为2),THIS指向 } } obj.add();function aaa(){console.log("a"+this);}function bbb(cb){ cb&&cb(); console.log("b"+this);}bbb.call(obj,aaa);*/
阅读全文
0 0
- canvas雨滴绘制总结(三)
- canvas雨滴绘制之(四)requestAnimationFrame
- 案例-雨滴-canvas绘制
- Canvas绘制雨滴(二)之setInterval与setTimeout
- canvas雨滴绘制(五)最终实现代码
- Canvas绘制雨滴之setInterval与setTimeout(一)
- canvas学习总结三:绘制路径-线段
- canvas实现雨滴效果
- canvas 雨滴demo
- Canvas绘制的总结
- Android画布和图形绘制---Canvas and Drawables(三)
- 图形绘制之——Canvas详解(三)
- canvas基础学习(三)-曲线的绘制
- canvas之三:绘制弧和圆
- Unity&Shader案例篇—绘制雨滴
- Unity&Shader案例篇—绘制雨滴
- canvas学习总结四:绘制虚线
- canvas学习总结六:绘制矩形
- 关于c++和C的getXXX系列函数
- DataStructureProject(3)
- linux基本操作---用户以及文件权限
- Dagger2 同时引用多个 Module 的三种写法
- Lvs+Ldirectord+Heartbeat
- canvas雨滴绘制总结(三)
- IO流(12)--装饰设计模式
- 替换死亡节点(三)
- Latex 公式太长等号对齐,argmin 符号在正下方,
- Web Api + Token + 签名
- sort 命令详解
- 关于校赛
- 大数据正式22
- Linux学习笔记