Update
项目已重构至2.0,启用了新的数据结构和代码结构。基本弥补了初版的大部分功能缺失。还有部分功能未实现,比如指南针、区域的绘制方式等。
其实代码早就写的差不多了,只是最近在准备期末复习,加上智商下线,所以一直忘了更新博客╮(╯_╰)╭。具体的项目地址在此。
2017/06/28
背景
面试失利后,最近在专攻工程设计项目,指望着能通过它咸鱼翻身去名企。项目中需要一种可以自由控制并显示自定义的矢量路径和兴趣点的地图模块,仔细查了查发现并没有现成的轮子可以用,便想着自己定义一种数据格式进行解析和渲染。但真正实践起来,才发现难度颇大,先在这里记录下自己的思路和方法。
预期功能
- 实现矢量路径的显示,不同道路的绘制样式不同。
- 可以显示建筑点,可以区分不同建筑或类别,建筑点可以被点击,并返回对应的消息
- 可以在特定的路径和建筑点上显示标签代表其名称。
- 可以使用手势进行操作,整体的显示效果类似于主流的几个地图App。
- 在单机上实现地图导航的功能。
技术原理实现
看了不少源码和资料,比如android-pathview和svg-android,里面的实现方式和项目构架思路都令我受益匪浅。在想了很久以后,根据本人项目的实际情况总结了一下我自己不成熟的想法。
数据结构
数据存储格式
最好是和原有的SVG的XML文档格式兼容,方便以后的解析和渲染,于是我选择了从SVG转换而来的VectorDrawable XML格式作为数据格式基础。
这是一个VectorDrawable格式的例子。
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="960dp" android:height="480dp" android:viewportWidth="960.0" android:viewportHeight="480.0"> <path android:pathData="M570.1,440.2l-29.2,-29c-7.1,-8.5 -6.2,-36.7 -6,-40.7H425c0.1,3.9 1.1,32.2 -6,40.7l-29.2,29c-1.2,1.4 -1.7,2.5 -1.6,3.4h-0.1c0.8,7.7 6.7,6.3 13.6,6.3H558c6.7,0 12.4,1.3 13.5,-5.6 0.6,-1 0.3,-2.3 -1.4,-4.1z" android:fillAlpha="1" android:strokeColor="#B4BEC8" android:fillColor="#B4BEC8" android:strokeWidth="2"/> <path android:pathData="M727.5,355.1c0,8.5 -6.6,15.4 -14.7,15.4h-465.5c-8.1,0 -14.7,-6.9 -14.7,-15.4V45.4c0,-8.5 6.6,-15.4 14.7,-15.4h465.5c8.1,0 14.7,6.9 14.7,15.4v309.7z" android:fillAlpha="1" android:strokeColor="#C8D2DC" android:fillColor="#C8D2DC" android:strokeWidth="2"/> <path android:pathData="M489,343.7c-0,-4.2 3.4,-6.3 3.6,-6.4 -2,-2.9 -5,-3.3 -6.1,-3.3 -2.6,-0.3 -5.1,1.5 -6.4,1.5s-3.4,-1.5 -5.5,-1.4c-2.8,0 -5.4,1.6 -6.9,4.2 -2.9,5.1 -0.8,12.7 2.1,16.8 1.4,2 3.1,4.3 5.3,4.2 2.1,-0.1 2.9,-1.4 5.5,-1.4 2.6,0 3.3,1.4 5.5,1.3 2.3,-0 3.7,-2.1 5.1,-4.1 1.6,-2.3 2.3,-4.6 2.3,-4.7 -0.1,-0 -4.4,-1.7 -4.5,-6.8M484.8,331.3c1.2,-1.4 2,-3.4 1.7,-5.3 -1.7,0.1 -3.7,1.1 -4.9,2.5 -1.1,1.2 -2,3.2 -1.8,5.2 1.9,0.1 3.8,-0.9 4.9,-2.4" android:fillAlpha="1" android:strokeColor="#C8D2DC" android:fillColor="#fff" <