在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;
}
}