3

何千ものマーカーを含むマップを表示しているため、マップ上に表示されているオーバーレイアイテムのみを描画することを学びたいです。次のような方法でオーバーレイアイテムが表示されているかどうかを確認する必要があることはわかっています。

private boolean isLocationVisible(location)
    {
        Rect currentMapBoundsRect = new Rect();
        Point currentDevicePosition = new Point();
        GeoPoint deviceLocation = new GeoPoint((int) (location.getLatitude() * 1000000.0), (int) (location.getLongitude() * 1000000.0));

        mapView.getProjection().toPixels(deviceLocation, currentDevicePosition);
        mapView.getDrawingRect(currentMapBoundsRect);

        return currentMapBoundsRect.contains(currentDevicePosition.x, currentDevicePosition.y);

    }

このメソッドが true を返す場合は、オーバーレイ項目を描画する必要があり、そうでない場合は描画してはなりません。

問題は、OverlayItem で onDraw をオーバーライドできないことです。そのため、自分のニーズを達成する方法がわかりませんでした。

マップ上に表示されているマーカーのみを描画するには、コードで何を変更すればよいですか?

これは私の ItemizedOverlayClass です:

            public class mItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    boolean onTapActivated=false; 
    private Drawable marker = null;
    private BusMap map = null;
    boolean comingFromFavoriteNameEdit=false; 

    public BmItemizedOverlay(Drawable defaultMarker, BusMap map) {
        super(boundCenterBottom(defaultMarker));
        this.map=map;
        this.marker=defaultMarker;
    }
    public mItemizedOverlay(Drawable defaultMarker, BusMap map, boolean onTapActivated) { 
          super(boundCenterBottom(defaultMarker));
          this.map=map;
          this.onTapActivated=onTapActivated;    
          this.marker=defaultMarker;
    }

    protected OverlayItem createItem(int i){return mOverlays.get(i);}

    public int size() {return mOverlays.size();}    

    public void clear(){mOverlays.clear();} 

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
    }
    public void setOverlays(ArrayList <OverlayItem> overlays) {
        mOverlays=overlays;
        populate();
    }   

    public void draw(Canvas canvas, MapView mapView, boolean shadow){
        if (mapView.getZoomLevel() > 17){
            boundCenterBottom(this.marker);
            super.draw(canvas, mapView, false);         
        }
    }
}
4

1 に答える 1

1

これを自分で処理する必要はありません。ItemizedOverlay可視マップの境界内に現在存在するマーカーのみをディスパッチして描画するのが仕事です。これがまだ起こっていないと信じるに至った理由は何ですか?

現在のOverlay実装が満足のいくものではないと判断した場合Overlayは、ドロー コールをオーバーライドするよりも、チェック メソッドを使用して に項目を追加または削除するタイミングを判断する方がよいでしょう。

于 2012-10-30T18:52:58.200 に答える