关于大名鼎鼎的百度Echarts我就不多说了 不了解的朋友直接看官方的例子吧 http://echarts.baidu.com/examples.html

前阵子我加入了一个WPF的技术交流群 此demo的完成 首先得感谢群里的上进有为青年 十年 他总能发一些效果 让人看了就忍不住想想自己有没有思路实现 甚至想写写看 于是就有了此demo

这个demo写了个什么东西 我先上个图吧 让大家有个直观的印象 录gif的关系 看起来可能有点卡

我没用过百度Echart 所以可能和百度Echart不太一样了 这不是重点 重点是看看实现的思路 了解基本的动画的话 自己想做什么样就做成什么样 可以总结下功能和参数 做成用户控件

关于可行性:以前常听人说wpf动画开多了会很卡,而我也没有写过含有大量动画的项目,不知道实际怎样,这个地图显然全是动画,所以我写了个测试动画性能的小程序,生成100个点和线跑动画,发现完全没有什么问题嘛.

所以wpf做这个东西肯定是完全没有问题的.附上这个小程序 动画性能测试 有兴趣的朋友可以开点动画 看看windows任务管理器里的cpu和内存的消耗情况

先说下大体的思路吧:

  1. 如果你没有搞设计的帮你做地图的话,基本得去网上找矢量地图,转后转换成path
  2. 找到省会城市的坐标,这就是运动轨迹的起点和终点
  3. 根据起点终点生成运动轨迹的path和跑动的点,在点上做路径动画,生成一个圆,中心放到到达城市的坐标处
  4. 可以考虑初始化过程的动画

接下来开始一步一步去实现

布局

最初的最初,我们得先考虑布局,为了防止一旦做成用户控件的话,设置尺寸时地图走形.

  1. 最外层肯定要用Viewbox,按比例缩放.需要注意的是,Viewbox内部放的控件是必须有具体的尺寸的,它才能进行缩放,当然不一定必须要显式的去设置内部的Width和Height,只要内部有实际意义上的尺寸就行.
  2. Viewbox内先放一个Grid,分成两列Width全部设置成auto,这样能根据内部控件的实际大小来决定列宽.
  3. 0列放一个StackPanel.这个是左侧当菜单用的RadioButton的容器,每个RadioButton都有具体的宽度,所以0列就有了具体的宽度
  4. 1列再放一个Grid,这个Grid一定要设置HorizontalAlignment="Left" VerticalAlignment="Top",就是靠左上角布局,这样他内部的控件就会给它撑起来,也就有了具体的尺寸,这样Viewbox才能够缩放
  5. 把地图的path全部放到这个Grid里,path的Stretch必须是None,这样path就会把这个Grid给撑起来,在这个Grid里面所有path的下面再放一个Grid,用来做生成的动画用的图形的容器,他的坐标是和父级Grid的坐标重合的

地图

关于找地图,不好找,我没有什么好的心得.反正目的就是找一个带有省会标记的地图矢量图,只要是矢量图,我们就应该有办法把他转换成Xmal.

我是在百度文库里找到一个ppt版的矢量地图,0下载券 矢量地图素材 下载下来后用ppt打开,要用微软的,别的可能保存不了源文件,右键地图=>另存为=>选.emf格式,然后用Microsoft Expression Design打开,然后右键=>导出

这样就得到了我们要的path,然后找到每个省会所对应的path,取他们的Canvas.Left+Width/2 Canvas.Top+Height/2 就是对应坐标点的(x,y).(我算的没这么精细了,就是大概加了下.这个工作太枯燥,这不是重点.)

先吐槽下我找的这个地图,北京和天津是连在一起的,廊坊也消失不见了,3个城市整个合成了一个path.所以建议大家自己再去找找

注意wpf的坐标都是以左上角开始的(0,0) 向右加x值 向下加y值 后面我们生成的图形定位时都要 x值-自身Width/2 y值-自身Height/2 这样才能让图形的中心对准需要定位的坐标点

有了地图和坐标,我们就可以做下面的工作了

生成动画所需要的跑动的点,运动轨迹的path,表示到达城市的圆圈

跑动的点

跑动的点,我用了一个Grid里面套了一个path和一个Ellipse.

椭圆做阴影,颜色和轨迹一样,加一个透明掩码OpacityMask,里面是一个放射型的渐变画刷RadialGradientBrush.原点GradientOrigin(0.8,0.5) offset0处设置为不透明,offset1处不透明度设置为2/16.

水滴型的path我就用blend里的钢笔随意画了一个,得到了它的Data. Fill给一个线型渐变画刷,StartPoint(0,0),EndPoint(1,0),offset0给一个半透明的轨迹色,offset1给个不透明的纯白.

这个Grid的IsHitTestVisible可以设置成false,不参与命中测试,这样鼠标在轨迹上时,点经过时,不会打断轨迹ToolTip的显示.

追求完美的话,建议自己去画个或写个path,思路可以参考我的另一篇博客 WPF绘制简单常用的Path 不过没有提到贝塞尔曲线,你可以自己研究下

城市的圆

他就是个圆圈,没什么好说的,注意一下中心的定位就行了 Ellipse 颜色和轨迹一样 ToolTip写上你想显示的东西

运动轨迹

我用的是弧线ArcSegment 两个城市的点确定了,那么可以通过两个点的x,y,根据勾股定理计算出线段的长度.给一个点,连接这两个城市的点,可以组成一个三角形,两个城市组成的线段对面的那个角可以设置成一个角度参数,

这个线段固定,对角的角度固定,那么他所对应的外接圆的圆弧就是固定的.我们可以根据正弦定理a/sinA=2r求出外接圆的半径.就可以画出这个弧线来了.然后可以给这个path的ToolTip附上鼠标移上去你想显示的东西.改下ToolTip的样式就行了

动画

点沿着轨迹跑的动画

这部分动画,我就不说了,我是拜读了周银辉大神的博客 http://www.cnblogs.com/zhouyinhui/archive/2007/07/31/837893.html

城市的圆的动画

给Ellipse的透明掩码OpacityMask加一个放射型的渐变画刷RadialGradientBrush,加三个节点,offset0,offset1都是不透明的,在他们中间加一个完全透明的节点,然后动画控制offset值由0到1或由1到0,看你心情.

初始化过程的动画

这部分动画其实就是计算时间,在合适的时间开始合适的动画.

运动轨迹的呈现:就是给运动轨迹path的透明掩码给一个线型渐变画刷,根据向左,右,上,下运动,设置好StartPoint和EndPoint,然后两个节点一个透明,一个不透明,同时从0向1做动画,需要注意的是如果一前一后运动,一定要透明的那个节点在前面运动,

不然会出现很怪异的行为,把这个动画的时间设置成跑动的点的一半的时间.这样轨迹比点跑的快,不至于点跑过去了,路径还没有呈现到那

关于城市的圆,这部分加的比较多,首先可以用一个DoubleAnimation来控制Ellipse的透明度,开始时间是轨迹呈现的时间,也就是点的时间/2,这样刚好轨迹呈现到圆时,圆开始呈现,动画时间也设置成轨迹呈现时间,这样刚好点运动到圆的时候,圆已经完全呈现完.

然后加一个ColorAnimation,来控制圆透明掩码里放射画刷的第二个节点,也就是控制点,让他变为透明,用时0就可以,这样就可以继续圆的放射型动画了.开始时间就是点运动到圆的时间.

OK,大功告成,接下来就是一些RadioButton,ToolTip,Path的样式问题了.这部分大家看心情,做个自己喜欢的样式就可以了.

最后附上代码 仿百度Echarts人口迁移图

WPF仿百度Echarts人口迁移图相关推荐

  1. 关于怎么在echarts飞机迁移图中换掉飞机图标

    其实这个在API文档中也有写到,但也是花费我一些时间修改的,所以就小小的记录下: 官方的例子显示的迁移图: 然后我们可以在js代码中找到以下代码: var planePath = 'path://M1 ...

  2. 百度echarts 堆砌面积图

    var option = {     tooltip: {         trigger: 'axis'     },     lineStyle:{         normal:{       ...

  3. SlideSwitch仿iphone滑动开关组件,仿百度魔图滑动开关组件Android

    SlideSwitch 仿iphone滑动开关组件,仿百度魔图滑动开关组件 1.AndroidManifest.xml <?xml version="1.0" encodin ...

  4. 仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图

    仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

  5. arcgis重心迁移分析_arcgis人口重心迁移图

    2 中图分类:C921 正文语种:chi 关键词:山东省;2000-2012 年;人口重心迁移 摘要:以人口重心理论为指导,绘制 2000-2012 年山东省人口重心移动轨迹 图,研究人口...... ...

  6. 起步平台 WeX5 集成百度echarts实现微信公众号中折线图颜色交错显示

    前端时间做了一个基于微信公众号的问卷调查.数据填报的项目,在里面涉及了一些图表的分析展示,本来以为很简单的一个功能,却着实让我折腾了好长一段时间,到处查找资料.翻看API也没有找到解决办法,真的想说, ...

  7. Echarts人口金字塔

    Echarts人口金字塔 先看一下设计效果图,如下图:这里完全实现这个效果是不好实现的,个人觉得有两个难点,一个是Y轴的列标,还有就是渐变效果,尝试了一下没有成功,就打住了 然后看一下最终的效果图,虽 ...

  8. 百度echarts使用

    百度echarts,将数据以图表方式展示: var startDate; var endDate; $(document).ready(function() {startDate = $(" ...

  9. 百度eCharts体验

    http://echarts.baidu.com/echarts2/doc/start.html 前言 从昨天开始给项目里添加一些图表对比功能,上一个项目里使用的是Highcharts,本打算继续用H ...

最新文章

  1. 45个超实用的JavaScript技巧及最佳实践(一)
  2. js中的true,false盲点
  3. java 对象被回收的例子_jvm(4)---垃圾回收(哪些对象可以被回收)
  4. AngularJs中,如何在ng-repeat完成之后,执行Js脚本
  5. java 操作日志设计_日志系统新贵 Loki,确实比笨重的ELK轻
  6. wrapper 并集如何使用
  7. python的枚举和for循环_python入门与进阶篇(三)之分支、循环、条件与枚举,python枚举...
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的中小型超市进销存管理系统
  9. CURL模拟访问网页
  10. 【车牌识别】基于matlab GUI BP神经网络车牌识别【含Matlab源码 669期】
  11. 重置Winsock失败,在NSHHTTP.DLL中初始化函数InitHelperDll启动失败,错误代码为10107的解决方法
  12. Excel-几行几行进行转置
  13. 学习日志day44(2021-09-08)(1、Ajax跨域操作 2、Ajax接收json数据 3、JQuery和Ajax 4、使用JavaScript模板简化操作)
  14. python拦截广告弹窗_Python Selenium关闭弹出广告。风
  15. DuckDuckGo 的盈利模式
  16. cmd指令ie打开html文件,命令行调用 IE 浏览器打开指定网址
  17. (译)在cocos2d里面如何使用物理引擎box2d:弹球
  18. 苹果微信多开_一个手机能登两个微信吗
  19. android商城demo,3 分钟快速 Demo(Android)
  20. CMMI2.0之我见-管理性能和度量MPM

热门文章

  1. 计算机基础知识整理 世上最全,计算机基础知识整理[世上最全]
  2. ABOV使用UART注意事项
  3. 私有化部署vs公有云部署,公私有别
  4. sql 查询不重复数据
  5. 数据包分析——数据链路层 和 网络层
  6. 【数学建模】线性代数模型(上)
  7. 二叉树层序遍历(c语言,非递归)
  8. docker公共存储库_docker公共仓库和私有仓库
  9. Docker-搭建私有仓库
  10. 戴尔服务器安装Exsi Server