读书人

google map中施用多种图钉来标示地点

发布时间: 2012-06-26 10:04:13 作者: rapoo

google map中使用多种图钉来标示地点
如题:要在google 地图中使用多种图钉来表示地点的不同状态,如红色图钉表示可用,黑色表示不可用等。找到一示例,是google论坛上的例子(http://groups.google.com/group/android-developers/browse_thread/thread/60666b7dae3f77b8)
源码如下:

public class NooYawk extends MapActivity {  private MapView map=null;  private MyLocationOverlay me=null;  private SitesOverlay sites=null;    @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);        map=(MapView)findViewById(R.id.map);        map.getController().setCenter(getPoint(40.76793169992044,                                            -73.98180484771729));    map.getController().setZoom(17);    map.setBuiltInZoomControls(true);        sites=new SitesOverlay();    map.getOverlays().add(sites);        me=new MyLocationOverlay(this, map);    map.getOverlays().add(me);  }    @Override  public void onResume() {    super.onResume();        me.enableCompass();  }    @Override  public void onPause() {    super.onPause();        me.disableCompass();  }    @Override  protected boolean isRouteDisplayed() {    return(false);  }    @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    if (keyCode == KeyEvent.KEYCODE_S) {      map.setSatellite(!map.isSatellite());      return(true);    }    else if (keyCode == KeyEvent.KEYCODE_Z) {      map.displayZoomControls(true);      return(true);    }    else if (keyCode == KeyEvent.KEYCODE_H) {      sites.toggleHeart();            return(true);    }        return(super.onKeyDown(keyCode, event));  }  private GeoPoint getPoint(double lat, double lon) {    return(new GeoPoint((int)(lat*1000000.0),                          (int)(lon*1000000.0)));  }      private class SitesOverlay extends ItemizedOverlay<CustomItem> {    private Drawable heart=null;    private List<CustomItem> items=new ArrayList<CustomItem>();    private PopupPanel panel=new PopupPanel(R.layout.popup);        public SitesOverlay() {      super(null);            heart=getMarker(R.drawable.heart_full);            items.add(new CustomItem(getPoint(40.748963847316034,                                          -73.96807193756104),                                "UN", "United Nations",                                getMarker(R.drawable.blue_full_marker),                                heart));      items.add(new CustomItem(getPoint(40.76866299974387,                                          -73.98268461227417),                                "Lincoln Center",                                "Home of Jazz at Lincoln Center",                                getMarker(R.drawable.orange_full_marker),                                heart));      items.add(new CustomItem(getPoint(40.765136435316755,                                          -73.97989511489868),                                "Carnegie Hall",              "Where you go with practice, practice, practice",                                getMarker(R.drawable.green_full_marker),                                heart));      items.add(new CustomItem(getPoint(40.70686417491799,                                          -74.01572942733765),                                "The Downtown Club",                        "Original home of the Heisman Trophy",                                getMarker(R.drawable.purple_full_marker),                                heart));      populate();    }        @Override    protected CustomItem createItem(int i) {      return(items.get(i));    }        @Override    public void draw(Canvas canvas, MapView mapView,                      boolean shadow) {      super.draw(canvas, mapView, shadow);          }        @Override    protected boolean onTap(int i) {      OverlayItem item=getItem(i);      GeoPoint geo=item.getPoint();      Point pt=map.getProjection().toPixels(geo, null);            View view=panel.getView();            ((TextView)view.findViewById(R.id.latitude))        .setText(String.valueOf(geo.getLatitudeE6()/1000000.0));      ((TextView)view.findViewById(R.id.longitude))        .setText(String.valueOf(geo.getLongitudeE6()/1000000.0));      ((TextView)view.findViewById(R.id.x))                              .setText(String.valueOf(pt.x));      ((TextView)view.findViewById(R.id.y))                              .setText(String.valueOf(pt.y));            panel.show(pt.y*2>map.getHeight());            return(true);    }        @Override    public int size() {      return(items.size());    }        void toggleHeart() {      CustomItem focus=getFocus();            if (focus!=null) {        focus.toggleHeart();      }            map.invalidate();    }        private Drawable getMarker(int resource) {      Drawable marker=getResources().getDrawable(resource);            marker.setBounds(0, 0, marker.getIntrinsicWidth(),                        marker.getIntrinsicHeight());      boundCenter(marker);      return(marker);    }  }    class PopupPanel {    View popup;    boolean isVisible=false;        PopupPanel(int layout) {      ViewGroup parent=(ViewGroup)map.getParent();      popup=getLayoutInflater().inflate(layout, parent, false);                        popup.setOnClickListener(new View.OnClickListener() {        public void onClick(View v) {          hide();        }      });    }        View getView() {      return(popup);    }        void show(boolean alignTop) {      RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(            RelativeLayout.LayoutParams.WRAP_CONTENT,            RelativeLayout.LayoutParams.WRAP_CONTENT      );            if (alignTop) {        lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);        lp.setMargins(0, 20, 0, 0);      }      else {        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);        lp.setMargins(0, 0, 0, 60);      }            hide();            ((ViewGroup)map.getParent()).addView(popup, lp);      isVisible=true;    }        void hide() {      if (isVisible) {        isVisible=false;        ((ViewGroup)popup.getParent()).removeView(popup);      }    }  }    class CustomItem extends OverlayItem {    Drawable marker=null;    boolean isHeart=false;    Drawable heart=null;        CustomItem(GeoPoint pt, String name, String snippet,               Drawable marker, Drawable heart) {      super(pt, name, snippet);            this.marker=marker;      this.heart=heart;    }        @Override    public Drawable getMarker(int stateBitset) {      Drawable result=(isHeart ? heart : marker);            setState(result, stateBitset);          return(result);    }        void toggleHeart() {      isHeart=!isHeart;    }  }}

整个项目链接:https://github.com/commonsguy/cw-advandroid/tree/master/Maps/ILuvNooYawk

读书人网 >移动开发

热点推荐