前段时间由于公司项目需要使用地图功能,刚开始看到功能需求的时候,以为只是简单简单的定位和基础地图的展示,于是就决定使用比较常用的百度地图,或者高德地图。项目启动之后,就开始接入百度地图的SDK开始做开发。当需求的功能基本完成的时候,一演示,经理说不是想要的效果,要把底图换成特定地方的地图,并且只展示指定的区域。这个需求让我犯难了,于是开始在百度地图官网上查询百度地图是否有这样的功能,果然百度地图的SDK还是很强大的,的确给开发者提供了这样的API,让开发者可以指定一张图片替换掉地图上指定的区域。但这个似乎经理的要求还是有一些不一样,替换完之后还要只显示这块区域,于是继续在官网上寻找答案,这次却没有收获,(在这里也希望阅读到这篇文章并且知道方法的大神可以给我留言)于是只能放弃使用百度地图了。之后又想到了既然是使用一张特定的地图那肯定就是有图片咯,那就用图片控件来展示不就好了,按照这个思路试了一下,可是烦人的OOM这个方法也被pass了(图片大小12702*9243)。于是开始在网上搜索解决办法,终于在一个博客中看到了一个叫mappwidget的库,用于手绘地图,这个似乎和我的需求很吻合。于是按照博客中的步骤开始生成地图资源,然后导入到项目里,然后初始化控件,一运行,项目跑起来了,基本满足需求,于是马上找经理演示,结果经理一看,提出了一堆问题,什么图片放大缩小不够平滑,缩放每次只能缩放一个等级.......让我一周内解决这些问题。一周!开什么玩笑!我才刚刚找到这个库,而且网上的资料也有限,这下可怎么办呢,不过还好这是个开源的项目,只能从源码上下手了,看来这一周注定会过得很充实啊。
开源项目地址:https://github.com/lemberg/mappwidget 里面包含了项目源码和jar包,下面我们就一步一步完成手绘地图的开发
1,使用Map Slicing Tool工具制作瓦片地图集
1,以插件形式安装该工具
打开eclipse的安装目录——plugins目录——将工具jar包粘贴——重启eclipse
2,在eclipse中用生成瓦片地图集
开发eclipse——Window——show View——Other——mAppWidget——Map Slicing Tool
3,根据工具栏的操作界面来选择地图原件,并选择生成地图集的保存地址,然后点击Export开始生成,如图
(其中Tile Size表示切割的每张图片的像素大小;GPS Positioning勾选之后可以输入图片四个点的坐标和对应的GPS坐标)
4,根据生成的保存地址找到生成的瓦片地图集文件夹,然后导入到项目中,项目文件结构如图:
到此瓦片地图集就完成了。
2,导入mappwidget库,展示地图
1,导入mappwidget_1.4.1_trial.jar
2,布局,用任何一种布局方式作为地图的载体,我以LinearLayout为例,如图:
3,调用地图类MapWidget,如图:
初始化地图,并加载,如图:
到此手绘地图的基本展示就完成了。
手绘地图的更多操作请参考博客http://blog.csdn.net/wangyuetingtao/article/details/9207231
接下来我要讲的是在一周的时间里如何解决经理提出的问题。
首先是关于缩放不平滑,感觉跳度很大的问题
既然要解决问题,首先我们要明白问题产生的原因,根据官方的文档,瓦片地图切割工具默认的切割比列是1/2,就是
每一个级别长宽都缩小为上一个级别的1/2,所以在缩放的时候会感觉长宽的变化太过生硬,那既然这样,我们把切割
比列变大不就好了,改为3/4,每次只放缩1/4,这样看不来不就不会那么突兀了。于是通过修改工具类源码,解决了
瓦片地图集切割的问题。把重新切割的图片导入到项目中之后发现不是原来的效果。原来只改变了切割的图片是不够
的,mappwidget库的计算方式也要改变,再通过改变计算方式,这下总算看到效果了。
关于手势缩放每次只能放大一个级别的问题
在源码中监听手势的时候改变了图片缩放的状态,使得每次手指按下之后只能缩放一个级别,通过修改源码也能实现。
在我的项目中还要其他的需求,对源码还做了其他的改动,就不上传了,要是对上面两个问题感兴趣的可以留言。