在使用Maps API时,我是初学者,所以请耐心等待,我知道还有很多其他帖子处理同样的问题,但我仍然卡住了。
我已经能够将一些叠加图像放到我的地图上。我现在唯一的问题是,当我缩小到足够的水平时,我不知道如何使它们消失,因为这会导致叠加图像聚集在一起并重叠 - 基本上使它们在该级别上无用。因此,任何有关如何使它们出现的帮助(在缩放级别18之后)都将非常受欢迎。
我尝试过使用缩放监听器和if语句,但它没有变化 - 很可能是因为我不知道我需要在哪里实现它和/或启用它需要什么其他方法。此外,我不确定如何实现draw()方法,因为许多其他人已经使用它来缩放和消失。
修改:
这是我到目前为止成功执行的两个类(在应用答案后):
Map.java 文件:
public class Map extends com.google.android.maps.MapActivity implements
OnOverlayGestureListener {
private boolean mShowOverlays = true;
private MapView mMapView;
MapView mapView;
MapController mapController;
private void setOverlayVisibility() {
boolean showOverlays = mMapView.getZoomLevel() > 18;
if (showOverlays != mShowOverlays) {
mShowOverlays = showOverlays;
for (Overlay overlay : mMapView.getOverlays()) {
if (overlay instanceof ItemOverlay) {
((ItemOverlay) overlay).setVisible(showOverlays);
}
}
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(17);
boolean showOverlays = mMapView.getZoomLevel() > 18;
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable lot = this.getResources().getDrawable(R.drawable.lot);
ItemOverlay parking_lot = new ItemOverlay(lot, this);
GeoPoint point1 = new GeoPoint(43806622, -79219797);
OverlayItem parking = new OverlayItem(point1, "Shopping Center","Parking Lot");
parking_lot.addOverlayItems(parking);
mapOverlays.add(parking_lot);
Drawable logo = this.getResources().getDrawable(R.drawable.entrance);
ItemOverlay ent = new ItemOverlay(logo, this);
GeoPoint start = new GeoPoint(43805697, -79221031);
mapController.setCenter(start);
OverlayItem welcome = new OverlayItem(start, "Welcome", " ");
ent.addOverlayItems(welcome);
mapOverlays.add(ent);
public <ZoomEvent> boolean onZoom(ZoomEvent ze, ManagedOverlay mo) {
setOverlayVisibility();
return true;
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
ItemOverlay.java 文件:
public class ItemOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
private boolean visible = true;
private boolean mVisible = true;
public void setVisible(boolean value) {
mVisible = value;
}
public boolean isVisible() {
return mVisible ;
}
@Override
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
if (mVisible) {
super.draw(canvas, mapView, shadow);
}
}
public ItemOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
// TODO Auto-generated constructor stub
mContext = context;
}
public void addOverlayItems(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
// TODO Auto-generated method stub
return mOverlays.get(i);
}
@Override
public int size() {
// TODO Auto-generated method stub
return mOverlays.size();
}
@Override
protected boolean onTap(int index) {
// TODO Auto-generated method stub
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
答案 0 :(得分:1)
我真的很喜欢使用Android的 OverlayManager 库。它为Google地图代码添加了一些功能,使一些事情变得更加容易。 Find it here包括some demo code that uses it
选项#1:如果您使用此选项,则可以使用OverlayManager的MapActivity手势监听器界面,以接收每个缩放(输入/输出)事件的回调。
public class Map extends MapActivity implements OnOverlayGestureListener
{
private boolean mShowOverlays = true;
private MapView mMapView; // assign this in onCreate()
private void setOverlayVisibility() {
boolean showOverlays = mMapView.getZoomLevel() >= 18;
if (showOverlays != mShowOverlays) {
mShowOverlays = showOverlays;
for (Overlay overlay : mMapView.getOverlays()) {
if (overlay instanceof ItemOverlay) {
((ItemOverlay)overlay).setVisible(showOverlays);
}
}
}
}
// this is the onOverlayGestureListener callback:
public boolean onZoom(ZoomEvent ze, ManagedOverlay mo) {
setOverlayVisibility();
return true;
}
}
您还必须将Map
实例添加为ManagedOverlay.setOnOverlayGestureListener()
的手势监听器。请参阅示例代码。
最后,在ItemOverlay类中,您可以覆盖draw()
方法,并根据叠加层是否已标记为可见来有选择地绘制。您需要添加自定义visible
属性:
public class ItemOverlay extends ItemizedOverlay {
private boolean mVisible = true;
public void setVisible(boolean value) {
mVisible = value;
}
public boolean isVisible() {
return mVisible ;
}
@Override
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
if (mVisible) {
super.draw(canvas, mapView, shadow);
}
}
}
选项#2:现在,仅仅为此目的使用Overlay Manager库可能会有点过分。因此,另一种可能更简单的方法是以described in this stack overflow answer的方式创建缩放监听器。 Kurru提供的代码将在您的Map
课程中提供。您可以在答案的代码中替换它:
checkMapIcons();
用上面显示的方法:
setOverlayVisibility();
所以,现在你有两种方式来观察&#34;缩放级别和覆盖ItemOverlay.draw()
允许您随时使标记消失(在此示例中缩放级别&lt; 18)。