在android地图开发过程中,我们常常会有这样一种需求:当点击或长按地图时,然后做一些事。比如:当我长按地图某一处时,为该处添加给图标
说下思路,首先创建一个图层,该图层继承overlay,然后在该图层中实现onLongPress接口,然后再把该图层添加到mapview中。
好了废话到此为止了,先来个效果图吧。当长按地图时添加一个marker:
现在说说代码吧,创建一个层叫MapEventsOverlay:
private class MapEventsOverlay extends Overlay{ @Override public boolean onLongPress(MotionEvent e,MapView mv){ Projection proj = mapView.getProjection();//获得投影对象 GeoPoint gp = (GeoPoint) proj.fromPixels(e.getX(), e.getY());//坐标转换 /**********自己写你要做的事咯,自己YY吧***********/ mapView.invalidate();//重绘地图 return true; } @Override protected void draw(Canvas c, MapView osmv, boolean shadow) { } public MapEventsOverlay(Context ctx) { super(ctx); } }
然后再把该层添加到mapview中:
MapEventsOverlay mo = new MapEventsOverlay(context);
mapView.getOverlayManager().add(mo);
好了,这就完事了
-----------------------------------------------------------------------------华丽分割线---------------------------------------------------------------------------------------------------
当然你也可以将此类独立出来,然后再另外创建一个接口类,这样其它地方也可以用了,干脆我把独立后的代码一并贴出来吧:
MapEventsOverlay:
public class MapEventsOverlay extends Overlay { private MapEventsReceiver mReceiver; /** * @param ctx the context * @param receiver the object that will receive/handle the events. * 必须实现 MapEventsReceiver 接口. */ public MapEventsOverlay(Context ctx, MapEventsReceiver receiver) { super(ctx); mReceiver = receiver; } @Override protected void draw(Canvas c, MapView osmv, boolean shadow) { //Nothing to draw } @Override public boolean onSingleTapUp(MotionEvent e, MapView mapView){ Projection proj = mapView.getProjection(); IGeoPoint p = proj.fromPixels(e.getX(), e.getY()); return mReceiver.singleTapUpHelper(p); } @Override public boolean onLongPress(MotionEvent e, MapView mapView) { Projection proj = mapView.getProjection(); IGeoPoint p = proj.fromPixels(e.getX(), e.getY()); //throw event to the receiver: return mReceiver.longPressHelper(p); } }
接口类:MapEventsReceiver
public interface MapEventsReceiver { boolean singleTapUpHelper(IGeoPoint p); boolean longPressHelper(IGeoPoint p); }
再来个使用例子吧:
public class MapEventsDemo extends Activity implements MapEventsReceiver { private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /************一些你自己的设置*****************/ MapEventsOverlay mapEventsOverlay = new MapEventsOverlay( getApplicationContext(), this); mapView.getOverlays().add(mapEventsOverlay); } //长按地图时触发 @Override public boolean longPressHelper(IGeoPoint igeo) { /**添加你的代码吧**/ mapView.invalidate(); return true; } @Override public boolean singleTapUpHelper(IGeoPoint arg0) { return false; } }