百度Mapapi中的覆盖类,主要用途就是我们在百度地图的背景基础上添加上我们自己的样式图层。覆盖类主要提供的类有这么几种:Overlay、Snappable、OverlayItem、ItemizedOverlay、ItemizedOverlay.OnFocusChangeListener
先来看看Overlay和Snappable
Overlay是一个基类
它表示可以显示在地图上方的覆盖overlay。 添加一个overlay时,从这个基类派生出一个子类,创建一个实例,然后把它加入到一个列表中。这个列表通过调用MapView.getOverlays()得到。
Overlay提供的方法:
可以看到提供的方法主要分为2类:1 draw绘制方法 2 onKeyDown、onTap等触摸事件
draw(Canvas canvas, MapView mapView, boolean shadow)
canvas提供了绘制工具,mapView就是画布,shadow是否设置阴影样式
最后别忘了MapView.getOverlays().add() 把新建的图层加载进去
下面再来看看按键事件
onKeyDown(int keyCode, KeyEvent event, MapView mapView)与onKeyUp(int keyCode, KeyEvent event,MapView mapView)
判断某一个按键的触发动作事件,例如按下了a、返回键 等等
keyCode - 按键代码。 该参数为被按下的键值即键盘码,手机键盘中每个按钮都会有其单独的键盘码,在应用程序都是通过键盘码才知道用户按下的是哪个键。
event - 按键事件。 该参数为按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。
mapView - 产生按键事件的MapView
onTap(GeoPoint p, MapView mapView)
在屏幕上按到了某个点了,例如自己定义的一个 point 点击之后 会弹出一个小窗口
onTouchEvent(MotionEvent e, MapView mapView)和onTrackballEvent(MotionEvent e, MapView mapView)
是在屏幕上进行了某种触摸或是滑动的操作时候的事件响应
参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。
下面来个例子看看这几种方法的使用:
public class MyOverlay extends Overlay
{
//我自定义一个图层继承自Overlay
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow){
GeoPoint geoPoint = new GeoPoint((int) ( 22.560034 * 1E6),(int) (113.940657 * 1E6));
Point point = mapView.getProjection().toPixels(geoPoint, null);
canvas.drawText("经纬度是:"+geoPoint.getLongitudeE6()/1e6+","+geoPoint.getLatitudeE6()/1e6, point.x, point.y, new Paint());
}
//点击屏幕上的点,就会触发这个事件
@Override
public boolean onTap(GeoPoint arg0, MapView arg1){
Toast.makeText(arg1.getContext(), "经纬度是:"+arg0.getLongitudeE6()/1e6+","+arg0.getLatitudeE6()/1e6, Toast.LENGTH_SHORT).show();
return super.onTap(arg0, arg1);
}
//按下返回键的时候触发的事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent arg1, MapView arg2){
if(keyCode==KeyEvent.KEYCODE_BACK){
System.out.println("KeyEvent.KEYCODE_BACK");
}
return super.onKeyDown(keyCode, arg1, arg2);
}@Override
public boolean onTouchEvent(MotionEvent event, MapView arg1){
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Toast.makeText(arg1.getContext(), "按下屏幕", Toast.LENGTH_SHORT).show();
System.out.println("ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
Toast.makeText(arg1.getContext(), "抬起来", Toast.LENGTH_SHORT).show();
System.out.println("ACTION_UP");
break;}
return super.onTouchEvent(event, arg1);}
@Override
public boolean onTrackballEvent(MotionEvent event, MapView arg1){
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
Toast.makeText(arg1.getContext(), "移动了", Toast.LENGTH_SHORT).show();
System.out.println("ACTION_MOVE");
break;
}
return super.onTrackballEvent(event, arg1);
}
}
Overlay的使用就介绍到这里,这样我们就可以利用百度地图进行二次开发了。但是,问题来了。如果我想在地图上标出多个准确位置的点信息怎么办呢。
overlay中是不能这样的。
那就要用到OverlayItem的相关知识了