android 高德地图简书,Android高德之旅(4)我的位置
廢話
說到吃飯,最近剛開了一家...咳咳,說到位置定位,主要包含兩部分,第一個是根據(jù)GPS獲取經(jīng)緯度,第二是根據(jù)經(jīng)緯度獲取省市區(qū)行政區(qū)劃。先說第一個,使用過地圖導航的都知道,定位我的位置通常是一個藍色的箭頭,在地圖上移動,我們也來實現(xiàn)這個效果。
1、基礎(chǔ)地圖
請參照本系列第一篇
2、我的位置
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_location);
mapView = (MapView) findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState); //此方法必須重寫
aMap = mapView.getMap();
setupMapView();
setupLocationStyle();
}
private void setupMapView() {
// 設(shè)置默認定位按鈕是否顯示,非必需設(shè)置
aMap.getUiSettings().setMyLocationButtonEnabled(true);
// 設(shè)置為true表示啟動顯示定位藍點,false表示隱藏定位藍點并不進行定位,默認是false
aMap.setMyLocationEnabled(true);
aMap.setOnMyLocationChangeListener(this);
}
private void setupLocationStyle() {
myLocationStyle = new MyLocationStyle();
// 默認模式,連續(xù)定位、且將視角移動到地圖中心點,定位點依照設(shè)備方向旋轉(zhuǎn),并且會跟隨設(shè)備移動,1秒1次定位
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
// 設(shè)置連續(xù)定位模式下的定位間隔,只在連續(xù)定位模式下生效,單次定位模式下不會生效。單位為毫秒
myLocationStyle.interval(500);
// 設(shè)置定位藍點的Style
aMap.setMyLocationStyle(myLocationStyle);
}
顯示效果如下:
3、藍點展示模式
定位藍點提供8種模式:
// 只定位一次
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);
// 定位一次,且將視角移動到地圖中心點
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) ;
// 連續(xù)定位、且將視角移動到地圖中心點,定位藍點跟隨設(shè)備移動,1秒1次定位
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW) ;
// 連續(xù)定位、且將視角移動到地圖中心點,地圖依照設(shè)備方向旋轉(zhuǎn),定位點會跟隨設(shè)備移動,1秒1次定位
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);
// 連續(xù)定位、且將視角移動到地圖中心點,定位點依照設(shè)備方向旋轉(zhuǎn),并且會跟隨設(shè)備移動,1秒1次定位
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
以下三種模式從5.1.0版本開始提供
// 連續(xù)定位、藍點不會移動到地圖中心點,定位點依照設(shè)備方向旋轉(zhuǎn),并且藍點會跟隨設(shè)備移動
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
// 連續(xù)定位、藍點不會移動到地圖中心點,并且藍點會跟隨設(shè)備移動
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);
// 連續(xù)定位、藍點不會移動到地圖中心點,地圖依照設(shè)備方向旋轉(zhuǎn),并且藍點會跟隨設(shè)備移動
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);
4、是否顯示定位藍點
// 方法自5.1.0版本后支持,設(shè)置false以后圖面上不再有定位藍點的概念,但是會持續(xù)回調(diào)位置信息
public void showLocatePoint(View view) {
myLocationStyle.showMyLocation(true);
}
5、自定義定位藍點圖標
public void customLocationIcon(View view) {
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.custom_location_icon);
myLocationStyle.myLocationIcon(bitmapDescriptor);
aMap.setMyLocationStyle(myLocationStyle);
}
6、設(shè)置藍點圖標的錨點
錨點是指定位藍點圖標像素與定位藍點坐標的關(guān)聯(lián)點,例如需要將圖標的左下方像素點與定位藍點的經(jīng)緯度關(guān)聯(lián)在一起,通過如下方法傳入(0.0,1.0)。圖標左上點為像素原點。
public void iconAnchor(View view) {
myLocationStyle.anchor(0.0f, 1.0f);
aMap.setMyLocationStyle(myLocationStyle);
}
7、精度圓圈的自定義
public void circleDisplay(View view) {
// 圓圈的邊框顏色
myLocationStyle.strokeColor(Color.RED);
// 圓圈的填充顏色
myLocationStyle.radiusFillColor(Color.LTGRAY);
// 圓圈的邊框?qū)挾?/p>
myLocationStyle.strokeWidth(2);
aMap.setMyLocationStyle(myLocationStyle);
}
8、設(shè)置定位頻次
myLocationStyle.interval(1000);
aMap.setMyLocationStyle(myLocationStyle);
最少設(shè)置1000毫秒,如果小于1000毫秒則當作1000毫秒。該方法只會作用在會執(zhí)行連續(xù)定位的工作模式上。
連續(xù)定位的工作模式有一下幾種:
MyLocationStyle.LOCATION_TYPE_FOLLOW ;
MyLocationStyle.LOCATION_TYPE_MAP_ROTATE;
MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE;
9、獲取經(jīng)緯度信息
說了半天,我們只是看到了地圖上的顯示,還不知道具體的經(jīng)緯度地點,通過一個簡單的回調(diào)就可以獲得
aMap.setOnMyLocationChangeListener(this);
@Override
public void onMyLocationChange(Location location) {
Log.e("TAG", "MyLocation=[" + location.getLongitude() + ", " + location.getLatitude() + "]");
}
10、接下來就是根據(jù)經(jīng)緯度獲取省市區(qū)
GeocodeSearch geoSearch = new GeocodeSearch(context);
geoSearch.setOnGeocodeSearchListener(GeocodeSearch.OnGeocodeSearchListener);
@Override
public void onRegeocodeSearched(RegeocodeResult result, int code) {
Log.e("TAG", "code=" + code);
RegeocodeAddress address = result.getRegeocodeAddress();
if (address == null) {
Log.e("TAG", "結(jié)果為空");
} else {
Log.e("TAG", "地址:" + address.getProvince() + address.getCity() + address.getDistrict());
}
}
public void queryProvinceCity(View view) {
// 第一個參數(shù)表示經(jīng)緯度,第二參數(shù)表示范圍多少米,第三個參數(shù)表示是火系坐標系還是GPS原生坐標系
LatLonPoint point = new LatLonPoint(longitude, latitude);
RegeocodeQuery query = new RegeocodeQuery(point, 200,GeocodeSearch.AMAP);
geoSearch.getFromLocationAsyn(query);
}
11、很自然我們會想到反向的過程
// 第一個參數(shù)是城市名,第二個參數(shù)是城市代碼
GeocodeQuery query = new GeocodeQuery("北京市", "010");
geoSearch.getFromLocationNameAsyn(query);
@Override
public void onGeocodeSearched(GeocodeResult result, int code) {
Log.e("TAG", "code=" + code);
}
總結(jié)
好啦,本期節(jié)目就到這里,感謝大家的收看,我們下期再見~
總結(jié)
以上是生活随笔為你收集整理的android 高德地图简书,Android高德之旅(4)我的位置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GB35114---基于openssl加
- 下一篇: Android逐帧动画的实现