android google map 地图 ItemizedOverlay 选中

本文介绍如何在Android应用中使用Google Maps API实现地图上标记点的图片切换功能,通过点击改变标记状态,并提供了一个示例代码来展示如何正确设置标记点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android中使用 Googlemap的时候遇到想要在地图上加一些点(图片),然后点击之后图片换成另外一张图片,表示这个点被选中,但是一直没有找到很好的例子,看了半 天API还是还是没头绪,最后找到了问题的关键所在,原来OverlayItem在setMarker的时候需要对 Drawable.setBounds(0,0,focusedMarker.getIntrinsicWidth(),focusedMarker.getIntrinsicHeight()); 否则点击Marker后原来的Marker就“消失”了。最后终于找到了一个外国网站解决了问题,网址:http://developmentality.wordpress.com/2009/10/16/android-overlayitemsetmarkerdrawable-icon/

package cn.rebo.android.activity;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
import cn.rebo.android.R;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class MapTestMain extends MapActivity {

 private MapView mMapView;
 private MapController mMapController;
 private LocationManager mLocationManager;
 private Location mLocation;
 private GeoPoint mGeoPoint;
 private String provider;

 private String coordinates[] = { "30.25044", "120.140488" };
 private final static int zoomLevel = 13;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.map_view);
  initMap();
  getCurrentLocation();
 }

 private void initMap() {
  mMapView = (MapView) findViewById(R.id.mapView);
  mMapView.setSatellite(true);
  mMapView.setBuiltInZoomControls(true);

  Double latitude = Double.parseDouble(coordinates[0]) * 1E6;
  Double longitude = Double.parseDouble(coordinates[1]) * 1E6;
  GeoPoint oldGeoPoint = new GeoPoint(latitude.intValue(), longitude
    .intValue());

  mMapController = mMapView.getController();
  mMapController.setZoom(zoomLevel);
  mMapController.setCenter(oldGeoPoint);
 }

 private void getCurrentLocation() {
  mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

  Criteria mCriteria = new Criteria();
  mCriteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度
  mCriteria.setAltitudeRequired(false);// 不要求海拔
  mCriteria.setBearingRequired(false);// 不要求方位
  mCriteria.setCostAllowed(true);// 允许有花费
  mCriteria.setPowerRequirement(Criteria.POWER_LOW);// 低功耗
  // 取得效果最好的criteria
  provider = mLocationManager.getBestProvider(mCriteria, true);

  // 得到坐标相关的信息
  mLocation = mLocationManager.getLastKnownLocation(provider);

  if (mLocation != null) {
   Double geoLat = mLocation.getLatitude() * 1E6;
   Double geoLng = mLocation.getLongitude() * 1E6;
   mGeoPoint = new GeoPoint(geoLat.intValue(), geoLng.intValue());

   Drawable defaultMarker = getResources().getDrawable(
     R.drawable.icon_star_1);
   Drawable focusedMarker = getResources().getDrawable(
     R.drawable.icon_star_2);
   
   MyItemizedOverlay myItemizedOverlay = new MyItemizedOverlay(
     defaultMarker, getGeoPointList(), this, focusedMarker);
//   myItemizedOverlay.setOnFocusChangeListener(onFocusChangeListener);
   
   List<Overlay> listMapOverlay = mMapView.getOverlays();
   listMapOverlay.add(myItemizedOverlay);
  } else {
   displayToast("GPS current unavailable");
  }

 }

// private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {
//  public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus){
//  }
// };

 public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

  private ArrayList<OverlayItem> listOverlays = new ArrayList<OverlayItem>();
  private List<GeoPoint> listGeoPoint;
  private Context context;
  private Drawable defaultMarker;
  private Drawable focusedMarker;
  
  public MyItemizedOverlay(Drawable defaultMarker,
    List<GeoPoint> listGeoPoint, Context context, Drawable focusedMarker) {
   super(boundCenterBottom(defaultMarker));
   this.context = context;
   this.listGeoPoint = listGeoPoint;
   this.defaultMarker = defaultMarker;
   this.focusedMarker = focusedMarker;
   
   addOverlays();
  }

  public void addOverlays() {
   for (int i = 0; i < listGeoPoint.size(); i++) {
    GeoPoint eachGeoPoint = listGeoPoint.get(i);
    OverlayItem overlayItem = new OverlayItem(eachGeoPoint,
      "Hello! " + i, "I'm in Hangzhou,China! " + i);
    
    listOverlays.add(overlayItem);
   }
   populate();
  }

  public void addOverlay(OverlayItem overlayItem) {
   listOverlays.add(overlayItem);
   populate();
  }

  @Override
  protected OverlayItem createItem(int i) {
   return listOverlays.get(i);
  }

  @Override
  public int size() {
   return listOverlays.size();
  }
  
  @Override
  protected boolean onTap(int index) {
   OverlayItem item = listOverlays.get(index);
   displayToast(item.getTitle() + "/n" + item.getSnippet());
   
   //去除前一个焦点
   OverlayItem currentItem = getFocus();
   if(currentItem != null)
   {
    defaultMarker.setBounds(0,0,defaultMarker.getIntrinsicWidth(),defaultMarker.getIntrinsicHeight());
    boundCenterBottom(defaultMarker);//图片是显示在一个矩形区域,这句是将图片中心点作为其在屏幕的坐标
    currentItem.setMarker(defaultMarker);
   }
   
   //设置新的焦点
   focusedMarker.setBounds(0,0,focusedMarker.getIntrinsicWidth(),focusedMarker.getIntrinsicHeight());
   boundCenterBottom(focusedMarker);
   item.setMarker(focusedMarker);
   
   setFocus(item);//设置为焦点
   
   return true;
  }
  
  @Override
  public void draw(Canvas canvas, MapView mapView, boolean shadow) {
   super.draw(canvas, mapView, shadow);
   boundCenterBottom(defaultMarker);
  }
  
 }

 private void displayToast(String msg) {
  Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
 }

 private List<GeoPoint> getGeoPointList() {
  List<GeoPoint> list = new ArrayList<GeoPoint>();

  GeoPoint geoPoint = new GeoPoint((int) (30.21044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.22044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.23044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.25044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.26044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.27044 * 1E6),
    (int) (120.140488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.110488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.120488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.130488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.150488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.160488 * 1E6));
  list.add(geoPoint);
  geoPoint = new GeoPoint((int) (30.24044 * 1E6),
    (int) (120.170488 * 1E6));
  list.add(geoPoint);
  return list;
 }

 @Override
 protected boolean isRouteDisplayed() {
  return false;
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值