自己做的笔记,没有深层的东西,请大神绕行~
这篇说说定位,同样少不了官方文档和Demo~
其实就是看官方的东西然后自己打一遍,理解一遍,貌似没啥深层的东西,毕竟我们会用就行了嘛~
学定位之前先学学怎么移动我们的视图(我们看见的区域)。
AMap官方介绍是定义AMap 地图对象的操作方法与接口。我们去看这个类有这样的几个方法 :
void |
moveCamera(CameraUpdate update)
按照传入的CameraUpdate 参数移动可视区域。
|
void |
animateCamera(CameraUpdate update)
可视区域动画是指从当前可视区域转换到一个指定位置的可视区域的过程。
|
void |
animateCamera(CameraUpdate update, AMap.CancelableCallback paramCancelableCallback)
可视区域动画是指从当前可视区域转换到一个指定位置的可视区域的过程,在转换完成后, 将回调转入的AMap.CancelableCallback接口。
|
void |
animateCamera(CameraUpdate update, long durationMs, AMap.CancelableCallback paramCancelableCallback)
在指定的持续时间内,动画地移动地图到指定的位置,完成时调用可选的回调方法。
|
第一个是直接跳转到目标位置有动画;第二个是跳转到目标位置有动画传回调接口;第三个是可以设置移动时间去移动到目标位置。
怎么用呢,很简单啊aMap.moveCamera(update);就可以了。
那么CameraUpdate对象是什么呢?
我们去看CameraUpdate :定义了一个可视区域的移动。这个类对象在用户改变可视区域的时候被调用。如moveCamera(CameraUpdate)。使用CameraUpdateFactory 类可以构造CameraUpdate 对象。
好吧,工厂模式么?那我们去看CameraUpdateFactory 类:这是类是创建CameraUpdate对象的工厂类。
看下方法:
static CameraUpdate |
changeLatLng(LatLng latLng)
返回一个CameraUpdate对象,只改变地图可视区域中心点,地图缩放级别不变。
|
static CameraUpdate |
newCameraPosition(CameraPosition cameraPosition)
返回一个定义了可视区域移动位置CameraUpdate 对象。
|
static CameraUpdate |
newLatLng(LatLng latLng)
返回一个移动目的地的屏幕中心点的经纬度的CameraUpdate 对象。
|
static CameraUpdate |
newLatLngBounds(LatLngBounds bounds, int padding)
返回CameraUpdate对象,这个对象包含一个经纬度限制的区域,并且是最大可能的缩放级别。
|
static CameraUpdate |
newLatLngBounds(LatLngBounds bounds, int width, int height, int padding)
返回CameraUpdate对象,这个对象包含一个经纬度限制的区域这个区域将会放置在屏幕中间, 并且是最大可能的缩放级别。
|
static CameraUpdate |
newLatLngZoom(LatLng latLng, float zoom)
返回一个CameraUpdate 对象,包括可视区域框移动目标点屏幕中心位置的经纬度以及缩放级别。
|
static CameraUpdate |
scrollBy(float xPixel, float yPixel)
返回一个CameraUpdate 对象,此对象为改变可视区域的中心的值,单位像素。
|
static CameraUpdate |
zoomBy(float amount)
返回一个CameraUpdate对象,改变了当前可视区域的zoom 级别。
|
static CameraUpdate |
zoomBy(float amount, Point focus)
返回一个CameraUpdate 对象改变当前可视区域的缩放级别。
|
static CameraUpdate |
zoomIn()
返回一个包含缩放级别增大的CameraUpdate 对象,调用此方法一次缩放级别加大一级,也就是屏幕距离地面更近一级。
|
static CameraUpdate |
zoomOut()
返回一个包含缩放级别减小的CameraUpdate 对象,调用此方法一次缩放级别的减小一级,也就是屏幕距离地面更远一级。
|
static CameraUpdate |
zoomTo(float zoom)
返回一个包含缩放级别改变的CameraUpdate 对象。
|
OK 从字面上看就可以看懂了,但是好像还有点不理解的东西,缩放级别是什么呢?其实啊 就是我们所说的放大缩小~ 高德地图的缩放级别范围是3-19,这个级别怎么来的呢,可以用zoomOut和zoomTo测试出来(不断放大缩小然后输出日志),还有一种就是用AMap类的两个现成的方法:
float |
getMaxZoomLevel()
返回当前可视区域的最大缩放级别。
|
float |
getMinZoomLevel()
返回当前可视区域的最小缩放级别。
|
特别说明下:scrollBy(float xPixel, float yPixel)这个方法,这是移动视图的方法 怎么移动呢,传入两个float参数,这两个参数你可以想象成二维坐标(其实就是)这个坐标轴的特点是左小右大,上小下大。
举个例子: 左移
aMap.moveCamera(CameraUpdateFactory.scrollBy(-10, 0));//这个10是我随便设置的长度
右移
aMap.moveCamera(CameraUpdateFactory.scrollBy(10, 0));
上移
aMap.moveCamera(CameraUpdateFactory.scrollBy(0, -10));
下移
aMap.moveCamera(CameraUpdateFactory.scrollBy(0, 10));
好了,剩下的方法慢慢去研究吧,墨迹了一大堆,开始定位吧!
-------------------------定位开始----------------------------
好啦,先看看官方Demo怎么实现吧,去看Location小蓝点功能下的代码 路径:/AMap_Android_API_2DMap_Demo_V2.7.0_Location_API_V2.0/src/com/amap/map2d/demo/location/LocationSourceActivity.java
一看,稍微有点晕啊~那咱再看看别的,去看官方文档吧 http://lbs.amap.com/api/android-sdk/guide/maplayer/#location 貌似写的有点抽象~ 那怎么办呢? 嘿嘿 其实啊 定位这个功能详细的介绍不在这里,我们刚刚看的是地图的SDK(红色框),高德还有一个专门的定位SDK(绿色框),如图,好 我们去这里看下http://lbs.amap.com/api/android-location-sdk/guide/startlocation/
好了,官方介绍很详细了 我们看下
以下来自官方文档
第一步,初始化定位客户端,设置监听
注:请在主线程中声明AMapLocationClient类对象,需要传Context类型的参数。推荐用getApplicationConext()方法获取全进程有效的context。
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener();
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mlocationClient.setLocationListener(mLocationListener);
第二步,配置定位参数,启动定位
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅设备定位模式),是否返回地址信息等。
//声明mLocationOption对象
public AMapLocationClientOption mLocationOption = null;
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mlocationClient.setLocationOption(mLocationOption);
//启动定位
mlocationClient.startLocation();
第三步,实现AMapLocationListener接口,获取定位结果
AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
amapLocation.getLongitude();//获取经度
amapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位时间
amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
amapLocation.getCountry();//国家信息
amapLocation.getProvince();//省信息
amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
amapLocation.getCityCode();//城市编码
amapLocation.getAdCode();//地区编码
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
第四步,关于停止定位
mlocationClient.stopLocation();
//停止定位
销毁定位客户端:
销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。
mlocationClient.onDestroy();
//销毁定位客户端。
以上来自官方文档
OK 这回我们在去看Demo 能明白了吧~
定位的这几个类有什么方法 具体去看官方http://lbs.amap.com/Public/reference/AMap_Location_API_Doc_V2.3.0_20160112/
AMap.setMyLocationType(int type); 这个方法了
下一篇说 覆盖物