覆盖物包括:本地覆盖物和搜索覆盖物
本地覆盖物的抽象基类: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
}
}