先上 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动画之动态绘出六边形的更多相关文章

  1. JS canvas标签动态绘制图型

    使用canvas标签动态绘制图型,当点击鼠标时,以鼠标点击的坐标作为图形中心点.当点击数为偶数时画三角形,当点击数为奇数时画五角星 <!DOCTYPE HTML> <html> ...

  2. 简单酷炫的canvas动画

    作为一个新人怀着激动而紧张的心情写了第一篇帖子还请大家多多支持,小弟在次拜谢. 驯鹿拉圣诞老人动画效果图如下 html如下: <div style="width:400px;heigh ...

  3. HTML动画分类 HTML5动画 SVG库 SVG工具 Canvas动画工具

     1.js配合传统css属性控制,可以使用setTimeout或者高级的requestAnimationFrame 2.css3 3.svg 4.canvas(当然,这个还是要配合js)   也许这么 ...

  4. canvas动画:自由落体运动

    经过前面的文章,我们已经能够在canvas画布上画出各种炫酷的图形和画面,但是这些画面都是禁止的,怎么样才能让他们动起来呢? 如何绘制基本图形可以参考:canvas基本图形绘制 如何对基本图形移动旋转 ...

  5. 8个经典炫酷的HTML5 Canvas动画欣赏

    HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮 ...

  6. 7个惊艳的HTML5 Canvas动画效果及源码

    HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来 ...

  7. 【原创】测试不同浏览器播放canvas动画的平滑程度

    Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基 ...

  8. HTML5 Canvas动画效果实现原理

    在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x ...

  9. 毕达哥拉斯树(pythagorasTree)原理解析及canvas动画实现

    以前就看到了这个东西,由于太忙了最近才有时间来实现这个; 该文章适合有一定 canvas 基础的人阅读; 首先说说他的原理: The construction of the Pythagoras tr ...

随机推荐

  1. STM32F10XX存储器细节

    >> STM32F10XX系统架构 >>  程序存储器.数据存储器.寄存器和输入输出端口被组织在同一个4GB的线性地址空间内. >>  数据字节以小端格式存放在存储 ...

  2. 用 eclipse 创建一个简单的 meaven spring springMvc mybatis 项目

    下面是整体步骤: 1: 先创建一个Maven 项目: 选择跳过骨架: 因为要搭建的是 web 项目  所以这个地方选择 war 包; 点击完成 这样就完成 Maven项目的搭建: 接下俩 先把 Mav ...

  3. C GOTO使用示例

    GOTO虽然会破坏程序的结构,使用代码可读性变差,但是GOTO依然还是有可用的地方 #include <stdio.h>#include <stdbool.h> int mai ...

  4. jdbc链接hive报错:java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransport

    写了个jdbc连接hive2的demo,结果报错:java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransport,实际 ...

  5. .1-Vue源码起步

    搞事!搞事! 截止2017.5.16,终于把vue的源码全部抄完,总共有9624行,花时大概一个月时间,中间迭代了一个版本(2.2-2.3),部分代码可能不一致,不过没关系! 上一个链接https:/ ...

  6. Vue源码后记-钩子函数

    vue源码的马拉松跑完了,可以放松一下写点小东西,其实源码讲20节都讲不完,跳了好多地方. 本人技术有限,无法跟大神一样,模拟vue手把手搭建一个MVVM框架,然后再分析原理,只能以门外汉的姿态简单过 ...

  7. Warning: Path must be a string . Received null Use --force to continue

    用grunt监视文件,当文件修改时,出现'Warning: Path must be a string . Received null Use --force to continuechuxian . ...

  8. Caffe Ubuntu16.04 GPU安装

  9. HBase数据备份及恢复(导入导出)的常用方法

    一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...

  10. 详细解读-this-关键字在全局、函数、对象、jQuery等中的基础用法!

    一.前言 1. Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的设计模式来实现面向对象的编程,其 ...