分爲地圖,定位,搜索(我還沒作導航功能)java
建議採用gradle方式集成
在project/build.gradle文件下添加jcenter的倉庫地址android
allprojects { repositories { jcenter() // 或者 mavenCentral() } }
在app/build.gradle下添加依賴api
android { defaultConfig { ndk { //設置支持的SO庫架構(開發者能夠根據須要,選擇一個或多個平臺的so) abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64" } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //3D地圖so及jar compile 'com.amap.api:3dmap:latest.integration' //定位功能 compile 'com.amap.api:location:latest.integration' //搜索功能 compile 'com.amap.api:search:latest.integration' }
navi導航SDK 5.0.0之後版本包含了3D地圖SDK,因此請不要同時引入 map3d 和 navi SDK。
在AndroidManifest.xml文件下添加權限網絡
<!--容許程序打開網絡套接字--> <uses-permission android:name="android.permission.INTERNET" /> <!--容許程序設置內置sd卡的寫權限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--容許程序獲取網絡狀態--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--容許程序訪問WiFi網絡信息--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!--容許程序讀寫手機狀態和身份--> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!--容許程序訪問CellID或WiFi熱點來獲取粗略的位置--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
如何獲取key看這裏 -> 點我查看Key註冊時必要數據SHA1和包名的獲取方法架構
同時建立debug和release的密鑰文件,在app/build.gradle下作配置:app
android { signingConfigs { release { keyAlias 'xxxxxx' keyPassword 'xxxxxx' //..表示工程目錄路徑 storeFile file('../jks/map_release.jks') storePassword 'xxxxxx' } debug { keyAlias 'xxxxxx' keyPassword 'xxxxxx' storeFile file('../jks/map_debug.jks') storePassword 'xxxxxx' } } }
而後獲取debug和release下的sha1值,在高德地圖控制檯建立key
而後在app/build.gradle下設置兩種key,這裏的key-value是同樣的。由於高德控制檯同一個應用下配置了debug和release的sha1值。maven
android { buildTypes { debug { manifestPlacesholders = [ //左邊的鍵MAP_API_KEY是自定義的名字,右邊的key-value是你申請的key值 "MAP_API_KEY" : "key-value" ] } release{ manifestPlacesholders = [ //左邊的鍵MAP_API_KEY要和debug下的保持一致,右邊的key-value是你申請的key值 "MAP_API_KEY" : "key-value" ] } } }
採用gradle方式集成,不須要在AndroidManifest.xml中添加key,添加定位服務ide
<application> <meta-data android:name="com.amap.api.v2.apikey" //要和app/build.gradle文件中設置的保持一致 android:value="${MAP_API_KEY}"/> <service android:name="com.amap.api.location.APSService"/> </application>
在佈局中引入地圖MapView佈局
// R.layout.activity_your_activity <com.amap.api.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent"/>
管理地圖的生命週期(很是重要),以Activity爲例gradle
public class YourActivity extends AppcompatActivity{ MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_your_activity); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.map); //在activity執行onCreate時執行mMapView.onCreate(savedInstanceState),建立地圖 mMapView.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),銷燬地圖 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView.onResume (),從新繪製加載地圖 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView.onPause (),暫停地圖的繪製 mMapView.onPause(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //在activity執行onSaveInstanceState時執行mMapView.onSaveInstanceState (outState),保存地圖當前的狀態 mMapView.onSaveInstanceState(outState); } }
構造一個AMap對象
if(mAMap == null){ mAMap = mapView.getMap(); }
相關類UiSettings
(不作介紹,具體看官方文檔),CameraUpdateFactory
,CameraUpdate
對於CameraUpdateFactory
,文檔介紹
建立CameraUpdate 對象,用來改變地圖狀態。
調用 AMap.animateCamera(CameraUpdate) or AMap.moveCamera(CameraUpdate)。
//設置地圖中心點 static CameraUpdate changeLatLng(LatLng latLng) static CameraUpdate newLatLng(LatLng latLng)
static CameraUpdate zoomTo(float zoom);
//設置地圖中心點以及縮放級別 static CameraUpdate newLatLngZoom(LatLng latLng, float zoom)
static CameraUpdate newLatLngBounds(LatLngBounds bounds, int padding)
建立LatLngBounds對象,LatLngBounds(LatLng southwest, LatLng northeast)
使用傳入的西南角座標和東北角座標建立一個矩形區域。
2.相關API
第二個方法添加一組marker,地圖會移動到該組marker所在區域的中心
//在地圖上添一個圖片標記(marker)對象。 Marker addMarker(MarkerOptions options) //在地圖上添一組圖片標記(marker)對象,並設置是否改變地圖狀態以致於全部的marker對象都在當前地圖可視區域範圍內顯示。 java.util.ArrayList<Marker> addMarkers(java.util.ArrayList<MarkerOptions> options, boolean moveToCenter)
3.如何使用:
//MarkerOptions的具體設置看官方文檔 MarkerOptions markerOptions = new MarkerOptions(); //設置marker座標 markerOptions.position(latLng); //marker是否可拖拽 markerOptions.draggable(false); //marker圖標 markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
BitmapDescriptorFactory位於com.amap.api.maps.model包下,包含多個生成BitmapDescriptor的方法,若是一組marker的圖標是一致的,建議先經過BitmapFactory生成一個bitmap,再經過BitmapDescriptorFactory.fromBitmap(bitmap)設置給marker.
若是一組marker數據量很大,不建議for循環遍歷逐個添加.
MarkerOptions markerOptions = new MarkerOptions(); Bitmap bitmap = BitmapFactory.decodeResources(drawableResId); List<DataBean> dataBeanList = new ArraryList<>(); int size = dataBeanList .size(); for(int x = 0;x< size; x++){ //設置marker座標 markerOptions.position(latLng); //marker是否可拖拽 markerOptions.draggable(false); //marker圖標 markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); //添加後返回該marker Marker marker = mAMap.addMarker(markerOptions); //爲marker添加信息 marker.setObject(dataBeanList.get(x)); }
上面這種方式添加的marker數據量過大的話,marker會逐一顯示在屏幕上,視覺效果不太好,建議採用下面的方法,經過addMarkers(List<MarkerOptions>)一次性所有添加.
MarkerOptions markerOptions = new MarkerOptions(); //一組marker的圖標一致的話,事先生成這個圖標的bitmap實例對象 Bitmap bitmap = BitmapFactory.decodeResources(drawableResId); List<DataBean> dataBeanList = new ArraryList<>(); ArrayList<MarkerOptions> markerOptionList = new Arrary<>(); for(int x = 0;x< size; x++){ //設置marker座標 markerOptions.position(latLng); //marker是否可拖拽 markerOptions.draggable(false); //marker圖標 markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap)); markerOptionList.add(markerOptions); } // 添加後返回一組Marker ArrayList<Marker> markerList = mAMap.addMarkers(markerOptionList); int index = 0; for(Marker marker : markerList ){ //爲marker設置信息 marker .setObject(dataBeanList.get(index++)); }
這種方法,可使一組marker幾乎同時出現,視覺效果更好.
4.marker的點擊事件再也不介紹.
5.更改已添加過的marker的屬性
marker.setIcon()彷佛無效果.待測
未完待續