1. 程式人生 > >222.map4-百度地圖新增覆蓋物

222.map4-百度地圖新增覆蓋物

所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標註、向量圖形元素(包括:折線和多邊形和圓)、定點陣圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的處理。
覆蓋物包括:本地覆蓋物和搜尋覆蓋物
本地覆蓋物的抽象基類:OverlayOptions(核心類)
圓形覆蓋物: CircleOptions
文字覆蓋物: TextOptions
marker覆蓋物: MarkerOptions
圓點覆蓋物:DotOptions
ground 覆蓋物:GroundOverlayOptions
圓點覆蓋物:DotOptions
多邊形覆蓋物:PolygonOptions
折線覆蓋物:PolylineOptions

弧線覆蓋物:ArcOptions

搜尋覆蓋物抽象類: OverlayManager (核心類)
本地搜尋覆蓋物:PoiOverlay
駕車路線覆蓋物:DrivingRouteOverlay
步行路線覆蓋物:WalkingRouteOverlay
換乘路線覆蓋物:TransitOverlay
公交路線覆蓋物:BusLineOverlay

地圖新增圓圈

package com.ldw.zbqq;

import android.os.Bundle;

import com.baidu.mapapi.map.CircleOptions;

/*
 * 覆蓋物,地圖上畫圓形影象
 */
public class CircleOptionsDemo extends BaseActivity {
	
	//重寫onCreate新增新方法,畫覆蓋物
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
	}

	private void draw() {
		// 定義一個圓
		// 圓心 + 半徑
		
		// 顏色 + 是否填充 + 圓的線寬
		
		// 覆蓋物的操作 
		// ① 建立自己
		CircleOptions circleOptions = new CircleOptions();
		// ② 給自己設定資料
		circleOptions.center(hmPos)// 圓心
		.radius(1000)// 半徑 單位是米
		.fillColor(0x60FF0000);// 透明度 紅 綠 藍
//		.stroke(new Stroke(10, 0x600FF000));// 邊框 引數1 線寬 引數2 顏色
		// ③ 把覆蓋物新增到地圖中
		baiduMap.addOverlay(circleOptions);
	}
}

新增文字
package com.ldw.zbqq;

import android.graphics.Typeface;
import android.os.Bundle;

import com.baidu.mapapi.map.TextOptions;

/*
 * 文字覆蓋
 */
public class TextOptionsDemo extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
	}

	private void draw() {
		TextOptions textOptions = new TextOptions();
		textOptions.fontColor(0x60FF0000)
		.text("文字") // 文字內容
		.position(hmPos) // 位置
		.fontSize(24)// 字型大小
		.typeface(Typeface.SERIF);// 字型,對稱的
//		.rotate(30);// 旋轉
		baiduMap.addOverlay(textOptions);
	}
}
MarkerOptions

某個型別的覆蓋物,包含多個型別相同、顯示方式相同、處理方式相同的項時,使用此類。或者用來標記位置。
開發步驟
設定 marker 覆蓋物的位置座標:position(LatLng position)
設定 marker 覆蓋物的標題:title(java.lang.String title)
設定 Marker 覆蓋物的圖示:icon(BitmapDescriptor icon)
設定 marker 是否允許拖拽,預設不可拖拽:draggable(boolean draggable)
準備好泡泡的layout
在MapView中新增該泡泡
addView(View child, LayoutParams params)
LayoutParams:MapViewLayoutParams
layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)設定為地圖模式, yOffset(-5)設定y軸離position的距離
在處理onMarkerClick時更新Layout,利用LayoutParams傳遞點位資訊,同時可以獲取標題資訊,設定給TextView

圖片的切換

//給向東的點新增一個切換動畫,圖片切換
		ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
		bitmaps.add(bitmapDes);
		bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
		markerOptions = new MarkerOptions().title("向東")
				.position(new LatLng(latitude, longitude + 0.001))
				.icons(bitmaps)// 顯示多個圖片來回切換 幀動畫
				.period(10);// 設定多少幀重新整理一次圖片資源,Marker動畫的間隔時間,值越小動畫越快
		baiduMap.addOverlay(markerOptions);

Mark覆蓋,建立了2個點來新增餐廳的圖示位置,並添加了點選事件,點選的時候會彈出pop,通過arrayList讓某一個點實現圖片切換達到閃動的目的

package com.ldw.zbqq;

import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;

import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapViewLayoutParams;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

/*
 * mark覆蓋物
 */
public class MarkerOptionsDemo extends BaseActivity{

	private View pop;
	private TextView title;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		draw();
		
		// 點選某一個Marker 在腦袋上彈出pop
		initPop();
		
		
		
	}

	private void initPop() {
		// 載入pop 新增到mapview 設定為隱藏
		//佈局填充
		pop = View.inflate(getApplicationContext(), R.layout.pop, null);
		//建立一個佈局
		LayoutParams params = new MapViewLayoutParams.Builder()
		.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照經緯度設定位置
		.position(hmPos)// 不能傳null 設定為mapMode時 必須設定position
		.width(MapViewLayoutParams.WRAP_CONTENT)
		.height(MapViewLayoutParams.WRAP_CONTENT)
		.build();
		//pop新增到mapView中
		//params必須是百度地圖的params
		mapview.addView(pop, params);
		//一開始隱藏pop
		pop.setVisibility(View.INVISIBLE);
		title = (TextView) pop.findViewById(R.id.title);
		
		
	}

	private void draw() {
		//描述一張圖片,聽過工廠類建立這個物件
		BitmapDescriptor bitmapDes = BitmapDescriptorFactory
				.fromResource(R.drawable.eat_icon);
		
		MarkerOptions markerOptions = new MarkerOptions();
		markerOptions.position(hmPos)// 設定位置
				.icon(bitmapDes)// 設定圖示
				.draggable(true)// 設定是否可以拖拽 預設是否
				.title("餐廳");// 設定標題
		//新增到圖層
		baiduMap.addOverlay(markerOptions);
		
		//新增一個新的座標點
		markerOptions = new MarkerOptions().title("向北")
				.position(new LatLng(latitude + 0.001, longitude))
				.icon(bitmapDes);
		baiduMap.addOverlay(markerOptions);
		
		//給向東的點新增一個切換動畫,圖片切換
		ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
		bitmaps.add(bitmapDes);
		bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
		markerOptions = new MarkerOptions().title("向東")
				.position(new LatLng(latitude, longitude + 0.001))
				.icons(bitmaps)// 顯示多個圖片來回切換 幀動畫
				.period(10);// 設定多少幀重新整理一次圖片資源,Marker動畫的間隔時間,值越小動畫越快
		baiduMap.addOverlay(markerOptions);
		
		//新增地圖上面的點選事件
		baiduMap.setOnMarkerClickListener(new MyListener());
	}
	
	class MyListener implements OnMarkerClickListener{

		@Override
		public boolean onMarkerClick(Marker arg0) {
			// 當點選時 更新pop的位置 設定為顯示
			LayoutParams params = new MapViewLayoutParams.Builder()
			.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照經緯度設定位置
			.position(arg0.getPosition())// 不能傳null
			.width(MapViewLayoutParams.WRAP_CONTENT)
			.height(MapViewLayoutParams.WRAP_CONTENT)
			.yOffset(-5)// 距離position的畫素 向下是正值 向上是負值
			.build();
			mapview.updateViewLayout(pop, params);
			pop.setVisibility(View.VISIBLE);//pop可見
			title.setText(arg0.getTitle());//設定標題
			
			return true;
		}
		
	}
}

基類

package com.ldw.zbqq;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;

import android.app.Activity;
import android.os.Bundle;

/*
 * 基類,後面直接來繼承
 */
public class BaseActivity extends Activity {

	protected BaiduMap baiduMap;
	protected MapView mapview;
	protected double latitude = 22.6934487;// 緯度
	protected double longitude = 114.5112523;// 經度
	protected LatLng hmPos = new LatLng(latitude, longitude);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		initManager();
		setContentView(R.layout.common);
		init();
	}
	
	private void initManager() {
//		SDKInitializer.initialize(getApplicationContext()); // 不能傳遞Activity,必須是全域性Context
	}

	private void init() {
		// 設定地圖級別(V2.X 3-19 V1.X 3-18)
		// ① 修改了檔案的格式 優化了空間的使用(北京 110M 15M)
		// ② 增加了級別 3D效果(18 19)

		mapview = (MapView) findViewById(R.id.mapview);

		baiduMap = mapview.getMap();
		// BaiduMap: 管理具體的某一個MapView : 旋轉,移動,縮放,事件。。

		// 描述地圖狀態將要發生的變化 使用工廠類MapStatusUpdateFactory建立
		MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 預設的級別12
		// 設定縮放級別
		baiduMap.setMapStatus(mapstatusUpdate);

		// LatLng latlng = new LatLng(arg0, arg1);// 座標 經緯度 引數1 緯度 引數2 經度
		MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
				.newLatLng(hmPos);
		// 設定中心點 預設是天安門
		baiduMap.setMapStatus(mapstatusUpdatePoint);

		// mapview.showZoomControls(false);// 預設是true 顯示縮放按鈕
		//
		// mapview.showScaleControl(false);// 預設是true 顯示標尺
	}
	@Override
	protected void onDestroy() {
		mapview.onDestroy();
		super.onDestroy();
	}
	@Override
	protected void onResume() {
		mapview.onResume();
		super.onResume();
	}

	@Override
	protected void onPause() {
		mapview.onPause();
		super.onPause();
	}
}

MainActivity.java列表顯示

package com.ldw.zbqq;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.baidu.mapapi.SDKInitializer;

public class MainActivity extends Activity {

	private static String[] objects = new String[] { "hello world", "圖層",
		"圓形覆蓋物", "展示文字", "marker覆蓋物", "矩形範圍內搜尋", "圓形區域", "全城搜尋", "駕車路線",
		"步行路線", "公交換乘", "我的位置" };
private static Class[] clazzs = new Class[] { HelloWorld.class,
		LayerDemo.class,CircleOptionsDemo.class,TextOptionsDemo.class,MarkerOptionsDemo.class,PoiSearchInBoundsDemo.class};
private ListView list;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	list = (ListView) findViewById(R.id.list);

	adapter = new ArrayAdapter<String>(getApplicationContext(),
			R.layout.item, objects);

	list.setAdapter(adapter);
	list.setOnItemClickListener(new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view,
				int position, long id) {
			Intent intent = new Intent(getApplicationContext(),
					clazzs[position]);
			startActivity(intent);
		}
	});

	//註冊程式碼,這個是非同步的方法,列表一開啟的時候就註冊了,防止後面載入資料的時候還沒有註冊完
	SDKInitializer.initialize(getApplicationContext()); // 不能傳遞Activity,必須是全域性Context
}
    
}