1

私は Maps API の操作に関しては初心者なので、ご容赦ください。同じ問題を扱う他の多くの投稿があることは知っていますが、まだ行き詰まっています。

  • オーバーレイ イメージをマップに配置することができました。私が今抱えている唯一の問題は、十分なレベルをズームアウトすると、オーバーレイ画像が密集して重なり合うため、それらを非表示にする方法がわからないことです。基本的に、そのレベルでは役に立たなくなります。そのため、(ズームレベル18以降)それらを表示する方法についてのヘルプは本当にありがたいです.

  • ズーム リスナーと if ステートメントを使用してみましたが、変更はありませんでした。おそらく、どこに実装する必要があるのか​​ 、および/またはそれを有効にするために他にどのような方法が必要なのかがわからないためです。また、他の多くの人がこれを使用してスケーリングして非表示にするため、 draw() メソッドを実装する方法についてはわかりません。

編集:

これらは、これまでに正常に実行された2つのクラスです(回答を適用した後):

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

}
4

1 に答える 1

1

私はAndroid用のOverlayManagerライブラリを使用するのが本当に好きです。Googleマップのコードに機能を追加し、いくつかのことをはるかに簡単にします。 それを使用するいくつかのデモコードを含むここでそれを見つけてください

オプション#1:これを使用する場合は、MapActivityのOverlayManagerのジェスチャリスナーインターフェイスを使用して、各ズームイン/アウトイベントのコールバックを受信できます。

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:さて、この1つの目的のためだけにオーバーレイマネージャーライブラリを使用するのはやり過ぎかもしれません。したがって、別の、おそらくより簡単な代替手段は、このスタックオーバーフローの回答で説明されている方法でズームリスナーを作成することです。Kurruが提供するコードは、クラスに組み込まれます。回答のコードでこれを置き換えます。Map

checkMapIcons();

上で示した方法で:

setOverlayVisibility();

したがって、ズームレベルを「監視」する方法は2つあり、オーバーライドItemOverlay.draw()すると、いつでもマーカーを非表示にすることができます(この例ではズームレベル<18)。

于 2012-07-04T02:30:17.630 に答える