最近項目有一個功能需要實現(xiàn):通過后臺接口獲取經(jīng)緯度往踢,通過經(jīng)緯度在地圖上展示Marker坐標(biāo)腾誉,點擊坐標(biāo)展示詳情。
高德地圖有2D地圖和3D地圖兩種菲语,兩種地圖可實現(xiàn)的功能稍有差別妄辩。
主要來講:
1.3D比2D可實現(xiàn)更多顯示效果。
2.3D地圖必須要導(dǎo)入so文件山上,打包后會比較大眼耀。
我自己實測在使用3D地圖SDK導(dǎo)入arm64-v8a,armeabi,armeabi-v7a三個so文件后,release包大了35mb左右佩憾,這顯然是不太能接受的哮伟,所以果斷在項目中使用了2D地圖SDK。
下面介紹2D地圖開發(fā)中遇到的一些問題及處理方法妄帘,高德SDK的基本配置就不在這里介紹了楞黄。
一、2D地圖批量繪制Marker
2D地圖提供的API比3D少很多抡驼,比如3D有批量繪制Marker和清除全部Marker方法鬼廓,2D都沒有碎税,只能循環(huán)使用添加Marker的方法雷蹂。添加后地圖不能自動縮放匪煌,在頁面中包含全部Marker党巾,需要調(diào)用AMap類中animateCamera()方法。
drawMarker(latLng);
//通過此方法縮小或擴(kuò)大地圖,將所有坐標(biāo)顯示在頁面內(nèi)
//第二個參數(shù)為四周留空寬度
aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(boundsBuilder.build(), 15));
而且在批量繪制Marker后驳规,使用AMap類的clear()方法清除Marker同時也會清除定位藍(lán)點,再次點擊定位按鈕,藍(lán)點也無法再次顯示巩搏。也只能通過循環(huán)遍歷每一個Marker贯底,調(diào)用Marker的remove()方法進(jìn)行清除撒强。
/*******存儲所有Marker**********/
List<Marker> mAllMarker = new ArrayList<>();
/**
* 清除所有Marker
*/
private void clearAllMarker() {
for (Marker marker : mAllMarker) {
marker.remove();
}
mAllMarker.clear();
}
二胚想、2D地圖自定義定位按鈕
除了繪制Marker芽隆,高德地圖的定位按鈕默認(rèn)是在右上角,顯得很難看牙躺。
我們?nèi)粘J褂玫貓D軟件都是在左下角或者右下角孽拷。
查閱API沒有對定位按鈕位置的設(shè)置,只能進(jìn)行自定義代虾。
1.隱藏高德自帶的定位按鈕棉磨,在布局右下角加一個button按鈕乘瓤,通過系統(tǒng)的點擊監(jiān)聽進(jìn)行操作。
2.通過AMap類getMyLocation()方法獲取定位位置抬吟,然后移動地圖到定位點的坐標(biāo)火本。
//自定義定位到當(dāng)前地點,通過獲取經(jīng)緯度,移動到地圖上的位置
Location location = aMap.getMyLocation();
aMap.animateCamera(CameraUpdateFactory.changeLatLng(new LatLng(location.getLatitude(), location.getLongitude())));
ps:另外還可以通過定位后回調(diào)的方式進(jìn)行控制,這個方法稍微麻煩一些茫陆,這里就不做介紹簿盅,詳見3D地圖demo中的 “Location幾種模式_5.0.0之前的實現(xiàn)”
http://lbs.amap.com/api/android-sdk/download/
另外桨醋,點擊定位時發(fā)現(xiàn)定位按鈕點擊時會變藍(lán)色
于是我扒了一下SDK中asset文件喜最,找到了高德用的定位圖片步责,編寫selector文件蔓肯,實現(xiàn)相同的點擊效果蔗包。
三调限、getInfoWindow(Marker marker)和getInfoContents(Marker marker)方法的使用
這兩個方法的主要區(qū)別就是getInfoWindow不可自定義view背景耻矮,在創(chuàng)建View視圖的時候會使用SDK中infowindow_bg2d.9.png文件。SDK雖然已經(jīng)被混淆過了踱承,但是相關(guān)邏輯還是能看出來茎活。
//package com.amap.api.mapcore2d包下,b類,911行方法.
public void a(ab var1) throws RemoteException {
String var2 = "showInfoWindow";
LayoutParams var3 = null;
if(var1 != null) {
if(var1.getTitle() != null || var1.getSnippet() != null) {
this.e();
Marker var4 = new Marker(var1);
if(this.T != null) {
//賦值getInfoWindow()方法
this.R = this.T.getInfoWindow(var4);
}
try {
if(this.W == null) {
//創(chuàng)建時添加背景圖
this.W = bd.a(this.n, "infowindow_bg2d.9.png");
}
} catch (Exception var9) {
cm.a(var9, "AMapDelegateImpGLSurfaceView", var2);
}
if(this.R == null && this.T != null) {
//this.R實際為getInfoWindow()方法,所以如果沒有使用getInfoWindow()方法,
//則使用getInfoContents()方法,getInfoContents()方法可以自定義背景
this.R = this.T.getInfoContents(var4);
}
if(this.R != null) {
if(this.R.getBackground() == null) {
this.R.setBackgroundDrawable(this.W);
}
} else {
LinearLayout var5 = new LinearLayout(this.n);
var5.setBackgroundDrawable(this.W);
TextView var6 = new TextView(this.n);
var6.setText(var1.getTitle());
var6.setTextColor(-16777216);
TextView var7 = new TextView(this.n);
var7.setTextColor(-16777216);
var7.setText(var1.getSnippet());
var5.setOrientation(1);
var5.addView(var6);
var5.addView(var7);
this.R = var5;
}
var3 = this.R.getLayoutParams();
this.R.setDrawingCacheEnabled(true);
this.R.setDrawingCacheQuality(0);
s var10 = var1.b();
int var11 = -2;
int var12 = -2;
if(var3 != null) {
var11 = var3.width;
var12 = var3.height;
}
com.amap.api.mapcore2d.au.a var8 = new com.amap.api.mapcore2d.au.a(var11, var12, var1.getRealPosition(), -((int)var10.a) + var1.getWidth() / 2, -((int)var10.b) + 2, 81);
this.U = (ay)var1;
if(this.g != null) {
this.g.addView(this.R, var8);
}
}
}
}
順便吐槽一下高德:
1.2D有些方法在參考手冊里都沒有,只能復(fù)制方法名稱在3D的操作手冊中查找懒熙,而且方法說明很是簡單,這都給開發(fā)帶來了一定困難工扎。
2.個人提交工單基本等待時間都是兩天定庵,而且答非所問蔬浙,問的是2D地圖的問題畴博,給的竟然是3D地圖的API俱病,我也醉了亮隙。
相關(guān)demo已經(jīng)上傳至GitHub,demo中包含一個配置好的簽名文件溢吻,可以進(jìn)行debug和release打包促王。
https://github.com/duff627/AMap2DDemo/tree/master