canvas动画之动态绘出六边形
先上 demo:
https://grewer.github.io/JsDemo/canvasLine/
这两天我一直在研究这个动画,花了大量的时间来想是如何实现的,
一开始我是想在进入 canvas 时按时间来用 lineTo 绘出六边形,退出时反方向再绘出白色的一条线;
想这样:
function getSpeed(x, y) {
if (x < 100) {
if (y > 150) {
vx = Math.sqrt(3)
} else if (y > 50) {
vx = 0;
} else {
vx = -Math.sqrt(3);
}
vy = 1
} else {
if (y < 50) {
vx = -Math.sqrt(3);
} else if (y < 150) {
vx = 0;
} else {
vx = Math.sqrt(3)
}
vy = -1;
}
return { Vx: vx, Vy: vy };
}
进入canvas 根据 x,y 的坐标获取不同的速度;
然后再实现的过程中发现了很多问题,比如在在pixelRatio为1.x的屏幕上,线条显示粗细的问题,在绘制的时候会出现毛边效果,也会出现线条过粗的情况;
首先解决这个问题我是用 重置高度来实现的 ,如果换成context.clearRect(0,0, 200, 200)线条就会发生变化
也可以用
canvas.width = width * window.devicePixelRatio
canvas.style.width = width + 'px';
来改变,这个 three.js 的解决方案,
后来和我同学交流了一下,他告诉了我一个我没用过的 api:
setLineDash
这是链接:https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/setLineDash;
这确实是一个更好的方案,以前没发现这个,今天下午趁着空做好了这个动画:
html:
<canvas id="canvas" width="200" height="200" style="border:1px solid #000"></canvas>
js:
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
var offset;
var flag = true;
function animate() {
var myAnimation = requestAnimationFrame(animate);
offset += (flag === true) ? 10 : -10;
if (offset >= 0) {
offset = 0;
}
if (offset <= -600) {
offset = -600
cancelAnimationFrame(myAnimation);
}
canvas.height = 200;
context.strokeStyle = "#000";
context.moveTo(100, 200);
context.lineTo(100 + 50 * (Math.sqrt(3)), 150);
context.lineTo(100 + 50 * (Math.sqrt(3)), 50);
context.lineTo(100, 0);
context.lineTo(100 - 50 * (Math.sqrt(3)), 50);
context.lineTo(100 - 50 * (Math.sqrt(3)), 150);
context.closePath();
context.setLineDash([600, 600]);
context.lineDashOffset = -offset;
context.stroke();
}
canvas.addEventListener('mouseenter', function() {
offset = -600;
flag = true
animate();
})
canvas.addEventListener('mouseleave', function() {
flag = false;
})
如果不懂
context.setLineDash([600, 600]);
context.lineDashOffset = -offset;
这两个是什么意思可以看看文档,确实是一个好用的东西;
canvas动画之动态绘出六边形的更多相关文章
- JS canvas标签动态绘制图型
使用canvas标签动态绘制图型,当点击鼠标时,以鼠标点击的坐标作为图形中心点.当点击数为偶数时画三角形,当点击数为奇数时画五角星 <!DOCTYPE HTML> <html> ...
- 简单酷炫的canvas动画
作为一个新人怀着激动而紧张的心情写了第一篇帖子还请大家多多支持,小弟在次拜谢. 驯鹿拉圣诞老人动画效果图如下 html如下: <div style="width:400px;heigh ...
- HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具
1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js) 也许这么 ...
- canvas动画:自由落体运动
经过前面的文章,我们已经能够在canvas画布上画出各种炫酷的图形和画面,但是这些画面都是禁止的,怎么样才能让他们动起来呢? 如何绘制基本图形可以参考:canvas基本图形绘制 如何对基本图形移动旋转 ...
- 8个经典炫酷的HTML5 Canvas动画欣赏
HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...
- 7个惊艳的HTML5 Canvas动画效果及源码
HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来 ...
- 【原创】测试不同浏览器播放canvas动画的平滑程度
Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...
- HTML5 Canvas动画效果实现原理
在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x ...
- 毕达哥拉斯树(pythagorasTree)原理解析及canvas动画实现
以前就看到了这个东西,由于太忙了最近才有时间来实现这个; 该文章适合有一定 canvas 基础的人阅读; 首先说说他的原理: The construction of the Pythagoras tr ...
随机推荐
- win10 uwp 验证输入 自定义用户控件
TextBox是给用户输入,我们有时要用户只输入数字,而用户输入汉字,我们就有提示用户,那么这东西用到次数很多,我们需要做成一个控件. 我们可以用别人的库,我找到一个大神写的库,很好用 我们使用这个库 ...
- Java方法使用的有点总结
方法使用的优点: 1-将解决问题的方法与主函数代码分开,逻辑更清晰,代码可读性更强. 2-若方法出错,则程序可以缩小为只在该方法中查找错误,使代码更容易调试. 3-方法是解决一类问题的抽象,一旦写成功 ...
- 用Eclipse 搭建一个Maven Spring SpringMVC 项目
1: 先创建一个maven web 项目: 可以参照之前的文章: 用Maven 创建一个 简单的 JavaWeb 项目 创建好之后的目录是这样的; 2: 先配置maven 修改pom.xml & ...
- 树莓派.系统.修改声音输出通道(auto,hdmi,耳机接口)
树莓派平时通过耳机接口一直在正常使用 有一天外接了一个HDMI的屏幕, 结果耳机接口连着的音箱突然就没声音了,在网上查了资料,发现原来树莓派声音输出有3种模式 记录如下: 在命令行终端上输入下面命令将 ...
- LeetCode 112. Path Sum (二叉树路径之和)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- Java基础笔记2
1. 变量的定义 int money; int 变量类型 money 变量名 money=1000;变量的值 2. 自动类型转换 ①类型要兼容 容器 (水杯---竹篮---碗) ②目标类型 ...
- javascript算法(一)
1.实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 实现: function ...
- SpringMVC自定义配置消息转换器踩坑总结
问题描述 最近在开发时候碰到一个问题,springmvc页面向后台传数据的时候,通常我是这样处理的,在前台把数据打成一个json,在后台接口中使用@requestbody定义一个对象来接收,但是这次数 ...
- AngularJS学习篇(二十三)
AngularJS 路由 AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web applica ...
- 各大网站vip视频破解
昨天朋友问我有没有XX视频网站的会员,现在的视频网站那么多个,要是都买会员,那还得了,作为一名程序员,想看vip视频还是自己可以动手的. 然后就自己动手用vue做了个破解vip视频的网站,界面简介,不 ...