前言:地图,定位等SDK在现在的app中应用越来越广泛了。无论是百度家的还是高德家的,哪个“正儿八经”的app要是不用点他们的产品总感觉这个档次就上不去(有实力的大厂除外)~尤其在大数据时代,用户什么时间在什么坐标,停留了多久等数据看似无用,实际上早已被很多app暗中上传、暗中分析、暗中观察了有木有!
扯太远,今天想就以前做过的一款运动app(类似咕咚)简单的谈谈高德SDK的使用整个系列大概会写七八篇,每篇针对不同的点来谈谈高德相关SDK的具体运用一环套一环,最后连起来,一个简版的 咕咚 运动软件就造出来啦! 高德api并不完美,一样有很多坑,写这个系列的目的一是总结一下之前get到的知识,另一方面也是帮助需要做类似功能的朋友们更好的运用SDK,避免一些大坑~
高德SDK涉及到东西很多,跟百度一样,有 定位,地图,导航等好几大模块,既然都说了要徒手造咕咚,而咕咚的核心是运动数据记录,涉及到定位!定位又需要地图作为基础,so,这里先通过几个demo带大家 从基本的地图SDK入手!
一、初识高德地图SDK常见类
整个高德地图api也是采用面向对象的设计思路,SDK包含了各种具有不同能力的类,开发者要做的其实很简单
- 明确要实现的功能。
- 找到与之有关的类,查看该类在官方demo中的应用
- 写逻辑实现
废话不多说,下面直接重点介绍最最最重要的几个类
MapView:地图对象。
整个地图view,它的内部包含了很多其他的小对象,如一个“覆盖物”,一条“线”,一个“点”,一个“面”等,它有和activity类似的生命周期,并且需要在activity调用生命周期的方法里一起调用如:
/*
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
//deactivate();
}
AMap:地图控制器。
每个MapView都会有一个地图控制器,顾名思义,地图控制器就是用来控制这个地图对象的。 怎么个控制法?问得好!
整个地图SDK涉及到的功能无外乎
- 地图旋转,缩放,自带部件显示(主要包含地图上的指南针,比例尺等东西)
- 地图添加点,线,面,立体物
- 添加各种监听(地图加载状态监听,物体点击监听,物体状态改变监听等等等一大堆,)
- 控制相机 (相机模块下面会有介绍,不要急)
- 地图截屏,距离、面积计算等
总结下来就这么几大类,几乎每种都需要用到AMap~所以,这个类很强大,很重要。
CameraUpdateFactory:相机工场类。
这是一个很容易被名字误导的类,Camera?自拍么?
要知道,地图是很大的,手机屏幕是很小的,如何在很小的屏幕上去呈现这个很大的地图呢?自然就需要缩放和截取,屏幕上看到的地图永远是经过 缩小,和截取的一部分区域!而具体 缩放多少,截取呈现哪一部分呢?这个就是通过CameraUpdateFactory来控制的。
结合名字理解:相机更新工场,不难猜出,工场设计模式,那么其返回CameraUpdate对象,作用是更新当前的显示区域。
例如:目前的比例尺是x:1,屏幕显示的是上梅林卓越这边的缩放图。如果我想实现点击某个按钮后,屏幕由上梅林切换到相隔数千米外的景田莲花山(切换的方式有多种,闪切或者带动画的平移过去等都能实现) 就要用上CameraUpdateFactory了。
一个这么厉害的类,自然封装了很多了不得的方法~不会用不要急,这里先了解就好。
LatLng:高德坐标点。
这是一个包含经度longitude 和纬度latitude的坐标类,上面那个示例中的第一行代码其实就是获取一个高德坐标点而已。
所谓点连成线,咕咚的运动记录里面其实就是将一个个类似LatLng的点连起来而已,最后附上颜色,看起来就成了一段连贯的线~
至于怎么做到那么平滑,还有为什么说是类似LatLng的点 这两个问题后面回答~
Marker :地图覆盖物
这是一个灰常有用的类,顾名思义,覆盖在地图上的物体! 任何东西(图片,文字,一个View) 都可以通过构造一个Marker来添加到地图MapView上面显示出来~先看效果
如图。在刚才移动到的坐标上添加一个Marker(其实是一个View),看看代码:
LatLng start=new LatLng(dps.get(0).getLat(),dps.get(0).getLon()); //还是获取那个点LatLng
MarkerOptions markerOptions = new MarkerOptions(); //Marker的构造辅助类MarkerOptions,其实就是设置Marker的各种属性
markerOptions.anchor(0.5f, 0.5f); //中心基准位置
markerOptions.icon(BitmapDescriptorFactory.fromView(getStartViewByXML(mContext, R.drawable.testhead)));
//上面这行是重点 设置覆盖物的icon 通过BitmapDescriptorFactory的fromView方法,顾名思义~就是从一个view加载,
//所以getStartViewByXML(mContext, R.drawable.testhead)方法就是LayoutInflater出一个view罢了,只不过恰巧,这个view很美!!!
markerOptions.visible(true); //设置可见
markerOptions.position(start); //这个 覆盖物的位置,就是那个坐标点喽
markerOptions.perspective(true).draggable(false); //不让拖拽~
markerOptions.setFlat(true); //属性太多 这个忘了,,不是很重要
aMap.addMarker(markerOptions); // 看到没,,aMap又登场了! 简直就是场控
Polyline :线段
到这里~基础篇的主角登场啦!没错,就是线段!咕咚运动的轨迹回放模块核心就是呈现你运动的轨迹,而线段,就是轨迹的具体表现形式!这里上三张图对比
第一张:咕咚轨迹回放截图
第二张:之前的基础上添加了另外一个不太美的Marker,然后连成Polyline
第三张:将第一张放大,可以看到原来图1中平滑的轨迹立马出现明显的棱角(9个点连起来的8段线)
结论:咕咚的轨迹回放功能的本质就是记录下运动过程中的若干坐标点,最后将这些点两两连成线就成了轨迹!就是这么简单!!
到此,徒手造咕咚系列的第一篇就写完了!你看吧,其实咕咚核心的功能之一:轨迹回放模块灰常简单,简单到笔者只是调用几个高德api,秀下恩爱,撸两行代码就差不多实现了~
最后的最后再BB两句~慢跑是很一项很不错的运动!希望大家在“沉迷工作无法自拔”的同时每周能抽出点时间出去跑两步久坐,长吹空调的话,偶尔出点汗,对身体是极好的呦!