天天看點

Android 之 高德地圖學習 三 覆寫物

自己做的筆記,沒有深層的東西,請大神繞行~

Android真是個好東西啊,既可以打發時間還可以來充實自己,想當初 以為地圖和語音(科大)要多麼多麼NB才能搞呢,現在看來....沒有那麼複雜,全是當初‘見識’少啊,現在能比當初稍微強那麼一丢丢~

好了,開始吧~

同樣看官方文檔是怎麼解釋覆寫物的:

所有疊加或覆寫到地圖的内容,統稱為地圖覆寫物。如标記、矢量圖形元素(包括:折線、多邊形和圓)等。覆寫物擁有自己的地理坐标,當您拖動或縮放地圖時,它們也會随地圖移動。

其實啊,這個地圖我們看上去是一張圖檔,實際上它是分了好多個圖層的,就想ps裡的圖層一樣,每個圖層都可以編輯。具體高德用了幾個層 我還真不知道 因為我沒看到官方的标注但是百度地圖是這樣的

覆寫物的層級壓蓋關系,具體如下(從下至上的順序):

1、基礎底圖(包括底圖、底圖道路、衛星圖等);
2、地形圖圖層(GroundOverlay);
3、熱力圖圖層(HeatMap);
4、實時路況圖圖層(BaiduMap.setTrafficEnabled(true););
5、百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););
6、底圖示注(指的是底圖上面自帶的那些POI元素);
7、幾何圖形圖層(點、折線、弧線、圓、多邊形);
8、标注圖層(Marker),文字繪制圖層(Text);
9、指南針圖層(當地圖發生旋轉和視角變化時,預設出現在左上角的指南針);
10、定位圖層(BaiduMap.setMyLocationEnabled(true););
11、彈出窗圖層(InfoWindow);
12、自定義View(MapView.addView(View););
           

好了,了解完了繼續看官方文檔,大體上看文檔上有 折線、多邊形、圓、圖檔覆寫、标記(Marker)、弧形。

這裡我們隻說兩個,一個是折線一個是Marker ,折線呢是一個簡單基礎的例子,Marker呢是我們要重點掌握的,用的頻率比較多,剩餘的呢都大同小異啦。

首先我們看折線(Polyline):

折線的關鍵類為 Polyline,在地圖上定義了一組相連的線段。Polyline 對象由一組經緯度坐标組成,并以有序序列形式建立一系列的線段。

我們先去看類關于折線呢有兩個類:

Polyline 一個線段是多個連貫點的集合線段擁有以下屬性: 頂點 線段是由兩個頂點之間連貫的點構成的。
PolylineOptions 線段的選項類

要玩  Polyline 得知道怎麼添加吧,這個看官方文檔或者Demo或者是類都可以得出:

Polyline polyline AMap.addPolyline(PolylineOptions line);這個方法就是添加Polyline啦 

大家可能有疑問,為什麼還有傳回類型呢,其實啊PolylineOptions這個類可以了解成Polyline的宏觀設定看其部分方法就可以看出都是大體的設定,比如 是否使用紋理貼圖畫線

void

setDottedLine(boolean isDottedLine)

設定是否畫虛線。

PolylineOptions

setUseTexture(boolean useTexture)

設定是否使用紋理貼圖畫線

PolylineOptions

visible(boolean isVisible)

設定線段的可見性。

PolylineOptions

width(float width)

設定線段的寬度,機關像素。

PolylineOptions

zIndex(float zIndex)

設定線段Z軸的值

Polyline 這個類呢可以想成是微觀的設定(部分方法):

像什麼顔色啦,

void

setColor(int color)

設定線段的顔色

void

setDottedLine(boolean isDottedLine)

設定是否畫虛線,預設為false,畫實線

void

setGeodesic(boolean geodesic)

設定是否畫大地線,預設不畫大地線

void

setPoints(java.util.List<LatLng> points)

設定線段的頂點。

void

setVisible(boolean visible)

設定線段的可見屬性。

void

setWidth(float width)

設定線段的寬度

void

setZIndex(float zIndex)

設定線段Z軸的值。

好了直接看看代碼吧

PolylineOptions line = new PolylineOptions();
		//初始化折線的參數
<span style="white-space:pre">		</span>line.add(new LatLng(43.828, 7.621));
		line.add(new LatLng(39.90403, 16.407525));
		line.color(Color.GRAY);
		line.setDottedLine(true);
		line.geodesic(true);
<span style="white-space:pre">		</span>//添加折線
		Polyline addPolyline = aMap.addPolyline(line);
		addPolyline.setWidth(50f);//可以以後動态設定寬度
           

OK,說的很啰嗦 但終究折線是說完了。

其他的覆寫物都是大同小異的,下面去看主要的Marker

同樣兩個相關類:

Marker Marker 是在地圖上的一個點繪制圖示。
MarkerOptions 定義了一個marker 的選項。

官方介紹很詳細(其實一直都很詳細),直接看吧:

添加預設标記

标記顯示地圖上的單一位置。它可以使用一個标準的圖示,也可以由開發者自定義圖示。您可以通過 AMap.addMarker(markerOptions) 方法将一個标記添加到地圖上。

标記的屬性如下:

  • position(Required) 在地圖上标記位置的經緯度值。參數不能為空。
  • title 當使用者點選标記,在資訊視窗上顯示的字元串。
  • snippet 附加文本,顯示在标題下方。
  • draggable 如果您允許使用者可以自由移動标記,設定為“ true ”。預設情況下為“ false ”。
  • visible 設定“ false ”,标記不可見。預設情況下為“ true ”。
  • anchor圖示擺放在地圖上的基準點。預設情況下,錨點是從圖檔下沿的中間處。
  • perspective設定 true,标記有近大遠小效果。預設情況下為 false。
  • 可以通過Marker.setRotateAngle() 方法設定标記的旋轉角度,從正北開始,逆時針計算。如設定旋轉90度,Marker.setRotateAngle(90);
  • 通過setFlat() 方法設定标志是否貼地顯示。預設情況下為“false”,不貼地顯示。Marker.setFlat(true);

好了看下官方Demo如何添加的,和polyline是一樣的AMap.addxxx();

aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
				.position(Constants.CHENGDU).title("成都市")
				.snippet("成都市:30.679879, 104.064855").draggable(true));
           

這樣Marker就可以顯示出來了。

要注意的是想讓Marker能夠拖拽的話一定要有draggable(true)

然後就是為Marker添加監聽了:

<span style="white-space:pre">		</span>aMap.setOnMarkerDragListener(this);// 設定marker可拖拽事件監聽器
		aMap.setOnMapLoadedListener(this);// 設定amap加載成功事件監聽器
		aMap.setOnMarkerClickListener(this);// 設定點選marker事件監聽器
		aMap.setOnInfoWindowClickListener(this);// 設定點選infoWindow事件監聽器
		aMap.setInfoWindowAdapter(this);// 設定自定義InfoWindow樣式
           

然後實作監聽接口的方法:

接口和方法如何對應直接看名字就能看出來了。

/** 當使用者點選地圖時回調的接口。此接口必須在主線程中調用。 */
	@Override
	public boolean onMarkerClick(Marker arg0) {
		System.out.println("onMarkerClick");
		return false;
	}

	/** 提供了一個給預設資訊視窗定制内容的方法。 */
	@Override
	public View getInfoContents(Marker arg0) {
		System.out.println("getInfoContents");
		return null;
	}

	/** 提供了一個個性化定制資訊視窗的marker 對象。 */
	@Override
	public View getInfoWindow(Marker arg0) {
		System.out.println("getInfoWindow");
		return null;
	}

	/** 當marker 的資訊視窗被點選時,回調此方法。 */
	@Override
	public void onInfoWindowClick(Marker arg0) {
		System.out.println("onInfoWindowClick");

	}

	/** 當地圖載入成功後回調此方法。 */
	@Override
	public void onMapLoaded() {
		System.out.println("onMapLoaded");

	}

	/** 在marker拖動過程當中回調此方法 */
	@Override
	public void onMarkerDrag(Marker marker) {
		System.out.println("onMarkerDrag");
		String curDes = marker.getTitle() + "拖動時目前位置:(lat,lng)\n("
				+ marker.getPosition().latitude + ","
				+ marker.getPosition().longitude + ")";
		System.out.println(curDes);
	}

	/** 在marker拖動完成後回調此方法。 */
	@Override
	public void onMarkerDragEnd(Marker arg0) {
		System.out.println("onMarkerDragEnd");

	}

	/** 當marker開始被拖動時回調此方法。 */
	@Override
	public void onMarkerDragStart(Marker arg0) {
		System.out.println("onMarkerDragStart");

	}
           

行吧,就這麼着吧,純粹是寫着玩的看到這了基本都入門了,搜尋服務  poi啥的官方比較詳細。導航有時間再看吧