android: 高德地圖

分爲地圖,定位,搜索(我還沒作導航功能)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看這裏 -> 點我查看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)
使用傳入的西南角座標和東北角座標建立一個矩形區域。

添加marker

1.相關類
  • MarkerOptions
    爲marker設置屬性
  • BitmapDescriptorFactory
    生成BitmapDescriptor對象,設置給marker的icon.
  • BitmapDescriptor
    給marker設置icon,MarkerOptions.icon(BitmapDescriptor)

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()彷佛無效果.待測

顯示定位藍點

未完待續

相關文章
相關標籤/搜索