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); } }
新增文字
MarkerOptionspackage 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); } }
某個型別的覆蓋物,包含多個型別相同、顯示方式相同、處理方式相同的項時,使用此類。或者用來標記位置。
開發步驟
設定 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
}
}