所有疊加或覆寫到地圖的内容,我們統稱為地圖覆寫物。如标注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖示等。覆寫物擁有自己的地理坐标,當您拖動或縮放地圖時,它們會相應的處理。
覆寫物包括:本地覆寫物和搜尋覆寫物
本地覆寫物的抽象基類: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
}
}