本文转发自热爱前端知识的博客   原博客地址

介绍

在ECharts中看到过这种圆形扩散效果,类似css3,刚好项目中想把它用上,but我又不想引入整个echart.js文件,更重要的是想弄明白它的原理,所以自己动手。在这篇文章中我们就来分析实现这种效果的两种方法,先上效果图:

实现原理

通过不断的改变圆的半径大小,不断重叠达到运动的效果,在运动的过程中,设置当前canvas的透明度context.globalAlpha=0.95,使得canvas上的圆逐渐透明直至为0,从而实现这种扩散、渐变的效果。

实现方法一

1. 关键技术点

context.globalAlpha = 0.95; //设置主canvas的绘制透明度。

创建临时canvas来缓存主canas的历史图像,再叠加到主canvas上。

2. 绘制过程

首先,我们先来写一个绘制圆的方法:

//画圆

var drawCircle = function() {

context.beginPath();

context.arc(150, 100, radius, 0, Math.PI * 2);

context.closePath();

context.lineWidth = 2; //线条宽度

context.strokeStyle = 'rgba(250,250,50,1)'; //颜色

context.stroke();

radius += 0.5; //每一帧半径增加0.5

//半径radius大于30时,重置为0

if (radius > 30) {

radius = 0;

}

};

然后,我们创建一个临时canvas用来缓存主canvas上的历史图像,设置主canvas的透明度context.globalAlpha=0.95(关键一步),在每次调用drawCircle方法绘制一个新圆之前都把主canvas上的图像,也就是之前的图像给绘制到临时的canvas中,等到drawCircle方法绘制完新圆后,再把临时canvas的图像绘制回主canvas中。

核心代码如下:

//创建一个临时canvas来缓存主canvas的历史图像

var backCanvas = document.createElement('canvas'),

backCtx = backCanvas.getContext('2d');

backCanvas.width = width;

backCanvas.height = height;

//设置主canvas的绘制透明度

context.globalAlpha = 0.95;

//显示即将绘制的图像,忽略临时canvas中已存在的图像

backCtx.globalCompositeOperation = 'copy';

var render = function() {

//1.先将主canvas的图像缓存到临时canvas中

backCtx.drawImage(canvas, 0, 0, width, height);

//2.清除主canvas上的图像

context.clearRect(0, 0, width, height);

//3.在主canvas上画新圆

drawCircle();

//4.等新圆画完后,再把临时canvas的图像绘制回主canvas中

context.drawImage(backCanvas, 0, 0, width, height);

};

实现方法二

与上一种方法相比,这种方法更加简单,同样是用到了透明度逐渐减小直到为0的原理,不同的是这里并没有创建临时canvas,而是运用了context.globalCompositeOperation属性值source-over和destination-in来配合使用,查看globalCompositeOperation属性介绍

核心代码如下:

var render = function() {

//默认值为source-over

var prev = context.globalCompositeOperation;

//只显示canvas上原图像的重叠部分

context.globalCompositeOperation = 'destination-in';

//设置主canvas的绘制透明度

context.globalAlpha = 0.95;

//这一步目的是将canvas上的图像变的透明

context.fillRect(0, 0, width, height);

//在原图像上重叠新图像

context.globalCompositeOperation = prev;

//在主canvas上画新圆

drawCircle();

};

地图上的应用

这里我采用的是第二种方式,将扩散、渐变效果运用到了百度地图上,感觉还比较炫,查看更多demo

圆形扩散动画

运动轨迹动画

总结

方法一、二都能实现同样的效果,如果动画绘制、操作canvas比较频繁,建议采用第一种方式,用临时canvas来缓存历史图像,效率更高。

arcgis飞行轨迹动画_高德地图,百度地图,arcgis地图利用canvas动画绘制圆形扩散、运动轨迹等动态效果...相关推荐

  1. android 高德地图移动卡顿_高德、百度和腾讯三家比拼,哪个 Android 车机地图 App 更好用?...

    写在前面 不管是自己开车.还是平时打车,相信你一定留意过驾驶座旁边位于车辆中间的那块大屏幕,不管是平时开车导航.放音乐,还是通过倒车影像辅助倒车,都离不开这块屏幕,这就是中控车机. 中控车机往往搭载的 ...

  2. Android实现高德地图上拉,ScrollLayout:上拉滑动上滑拖出,类似高德地图百度地图抽屉拖拽效果...

    摘要 在ScrollView或者ListView里面使用ViewPager.支持手势上拉滑出,中途停顿,下滑退出页面,类似高德地图百度地图内场景抽屉拖拽效果效果 Gif动画 类似使用 Demo 下载A ...

  3. vue项目H5调起高德或百度地图手机应用,或调起高德百度网页版实现导航功能(已实现)

    需求说明:H5实现唤起高德和百度地图导航到目标景点的功能 分析:用户通过点击选择使用百度还是高德地图,点击后调用guide方法,判断设备上是否有高德或者百度APP,有就直接调用APP,如果没有就调用网 ...

  4. WEB页面或者H5页面如何打开高德或者百度地图APP导航(实战向)

    一.序言 在日常开发中,地图的接入使用在各大app和网站中我们都不难见到,打开方式也各有不同,嵌套内部的,或者是直接打开百度,高德,谷歌等地图app.相对来说,各大地图app的文档写的非常齐全,即使是 ...

  5. H5页面唤醒高德地图|百度地图App

    H5页面唤醒高德地图|百度地图App 移动端H5页面唤醒app,若唤醒失败则跳转到应用商城下载. 唤醒前需要检测当前操作系统,不同的操作系统用不同的协议 我这里的需求是唤醒失败就跳转到网页版的地图,若 ...

  6. Flutter对接第三方高德地图+百度地图基础定位实现

    Flutter对接第三方高德地图+百度地图基础定位实现 原创:@As.Kai 博客地址:https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助,点赞点赞点赞~ 高德 ...

  7. 地图导航业下半场,高德与百度地图各缺一子?

    百度地图和高德地图的份额之争一直没有平息,二者的用户量高低在业内一直是个谜. 有说高德超过百度的:在2017年8月,国内第三方数据研究机构Talking Data移动观象台发布的月度APP覆盖率排行榜 ...

  8. 5张对比图告诉你,天地图,高德地图,百度地图,谷歌地图区别

    先来看看传说中最争议的天地图吧. 最大放大距离,每厘米25米. 我们用这个体育场和下面的大厦做对比..其实还有大厦下的车..(这张图上的车看不清,真有,没骗你们....) 再上一张高德的, 最大50M ...

  9. canvas动画科技园_7个惊艳的HTML5 Canvas动画效果及源码

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

最新文章

  1. 在GridView内访问特定控件
  2. 测中策---我的Web自动化测试思路
  3. 2018个人写作计划~
  4. 将csv文件导入到mysql数据库
  5. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
  6. 记录gulp报错The following tasks did not complete: cssmin或类似任务
  7. Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行
  8. java.lang.OutOfMemoryError: Java heap space 解决方法
  9. workbench mysql mac_mysql workbench mac下载-mysql workbench mac 64位下载8.0.15 官方最新版__西西软件下载...
  10. Class.forName()用法详解
  11. java中随机数彩票练习_基于javascript实现彩票随机数生成(简单版)
  12. php 面相对象设计,PHP面向对象设计的规范
  13. Linked List Cycle
  14. 信息学奥赛一本通(1262:【例9.6】挖地雷)
  15. 《云计算:原理与范式》一3.10 企业对企业集成服务
  16. 【淘宝技术这十年】,读后总结篇 转载
  17. Spring源码之bean的加载(三)从bean中获取对象
  18. 集群为什么最少6个_结构化面试答题技巧:多年的经验告诉你,最少要注意这6个方面...
  19. 智能注塑工艺与模流分析技术研讨会暨上海大学Moldex3D实训基地开幕式圆满结束
  20. 被晨光搁浅的誓言无声

热门文章

  1. SAP历史库存MB5B的详解
  2. 利用BADI ME_PROCESS_PO_CUST進行PO check
  3. 纪念9.11十周年 奥巴马诵读圣经原文
  4. 大热荒野敲开资本大门后,精致露营就留得住年轻人吗?
  5. java springboot 搭建_springboot搭建java项目
  6. 定制android触控平板,Adobe发表六款Android平板用触控Apps,一套六款的工具组合
  7. python计算最大回撤_Python进阶量化交易场外篇3——最大回撤评价策略风险
  8. python os.walk如何还原所有路径名_python使用os.listdir和os.walk获得文件的路径
  9. suse 新增用户oracle,在SUSE Linux中让其他用户能运行Oracle命令
  10. linux调用一个函数失败 打印错误,linux系统调用出错时的处理函数