0

ズーム レベルが変更されるとすぐにイベントをトリガーできるズーム リスナーを実装する方法はありますか。これまでのところ、ズームレベルの変更を手動でチェックする onUserinteraction メソッドで管理してきました。もう 1 つのことは、オーバーレイを動的に追加/削除することです。これまでに行ったことは onUserinteraction メソッドにあります。mapOverlays.add() 関数を使用してオーバーレイを動的に追加する関数を呼び出し、追加は実際に動的に行われます。しかし、どういうわけか mapOverlays.remove() 関数はオーバーレイを削除していません

     //Function for adding first set of markers
     public void setOverlay()
{
    worldLength = World.length;
    mapOverlays = mapView.getOverlays();
    drawable0 = this.getResources().getDrawable(R.drawable.marker);
    itemizedOverlay0 = new MyItemizedOverlay(drawable0);
    for (int i = 0; i < worldLength; i++)
    {
        itemizedOverlay0.addOverlay(World[i]);
    }
    mapOverlays.add(itemizedOverlay0);
    mapView.postInvalidate();
}
     //Function for adding second set of markers
     public void setOverlay1() 
     {
      mapView.setStreetView(true);
      usaLength = USA.length;
      mexicoLength = Mexico.length;
               mapOverlays = mapView.getOverlays();
        drawable1 = this.getResources().getDrawable(R.drawable.marker);
        itemizedOverlay1 = new MyItemizedOverlay(drawable1);
        itemizedOverlay2 = new MyItemizedOverlay(drawable1);


        for (int i = 0; i < usaLength; i++) {
            itemizedOverlay1.addOverlay(USA[i]);
        }
        for (int i = 0; i < mexicoLength; i++) {
            itemizedOverlay2.addOverlay(Mexico[i]);
        }

        mapOverlays.add(itemizedOverlay1);
        mapOverlays.add(itemizedOverlay2);


    mapView.postInvalidate();

}

     public void onUserInteraction() {
   super.onUserInteraction();
   if(mapView.getZoomLevel()>3)
   {
       mapOverlays.remove(itemizedOverlay0);
       setOverlay1();
                 //the above happens
   }
   else if(mapView.getZoomLevel()<=3 && mapOverlays.size()>5)
   {
       mapOverlays.remove(itemizedOverlay1);
       mapOverlays.remove(itemizedOverlay2);
                 //the above doesn't
       setOverlay();   
   }
   else if(mapView.getZoomLevel()<=3)
   {

   }
}
4

3 に答える 3

1

カスタムズームハンドラーを実装してリスナーを追加するには、MapViewのサブクラスを作成する必要があります。まず、のインターフェイスを作成しましょうOnZoomListener。必要に応じてインターフェースを変更できることに注意してください。以下は、最初に使用するスケルトンコードです。


public interface OnZoomListener {
    /***
     * /**
     * Called when there is a zoom changes 
     * @param mapView Reference to the current map view
     * @param currentZoom The current zoom, set to -1 initially
     * @param newZoom The new zoom level
     */
     public void onZoomChanged(MapView mapView, int currentZoom, int newZoom);
}

OnZoomListenerここで、ズームが変更されるたびにこれを呼び出すサブクラスが必要です。これは、このSOAnswerの拡張であるスケルトンコードです。


public class MyMapView extends MapView {
    int oldZoomLevel=-1;
    OnZoomListener onZoomListener;

    public MyMapView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MyMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyMapView(Context context, String apiKey) {
        super(context, apiKey);
    }

    public void setOnZoomListener(OnZoomListener onZoomListener) {
        this.onZoomListener = onZoomListener;
    }

    @Override
    public void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        int newZoom = this.getZoomLevel();

        if (newZoom != oldZoomLevel) {
            // dispatch the listeners
            if(oldZoomLevel != -1 &&  onZoomListener != null) {
                onZoomListener.onZoomChanged(this, oldZoomLevel, newZoom);
            }

            // update the new zoom level
            oldZoomLevel = getZoomLevel();
        }
    }
}

MyMapViewこれで、標準の代わりにレイアウトで使用できますMapView。注:コードパッケージcom.so4729255は、私がテストにのみ使用するものです。


  <com.so4729255.MyMapView
                android:id="@+id/mapview"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:enabled="true"
                android:apiKey="YOUR API KEY"
                android:clickable="true"
        />

そして最後にOnZoomListener、コードにを追加します。以下のコードは、使用法を説明するためのトーストを示しています。そこで必要なことは何でもできます。


 MyMapView mapView = (MyMapView)this.findViewById(R.id.mapview);
        mapView.setOnZoomListener(new OnZoomListener() {
            public void onZoomChanged(MapView mapView, int currentZoom,
                    int newZoom) {
                // implement your handler here
                Toast t = Toast.makeText(WebViewMain.this, "Zoom has changed from " + currentZoom + " to " + 
                        newZoom, 500);
                t.show();
            }
        });

2番目の質問については、誰もが答えているように、呼び出しは、APIドキュメントMapView.invalidate()に従ってビューを強制的に再描画するため、新しい状態でマップを再描画する必要があります

于 2011-09-22T12:25:59.050 に答える
0

を使用してマップを更新する必要があります

mapview.invalidate()

postInvalidate は UI スレッドに無効化リクエストを送信し、invalidate() の呼び出しはビューを即座に無効化します

于 2011-09-22T10:56:25.640 に答える
0

ズーム レベルが変更されると、マップが再描画されるため、次のように、このタイプの機能をオーバーレイの draw メソッドに追加するだけです。

e@Override
public void draw(Canvas canvas, MapView mapv, boolean shadow)
{       
    int zoom = mapv.getZoomLevel();

    switch(zoom)
    {
        case 19:
            setMarkersForZoomLevel19();
            break;
        case 18:
            setMarkersForZoomLevel18();
            break;
        case 17:
            setMarkersForZoomLevel17();
            break;
        case 16:
            setMarkersForZoomLevel16();
            break;
        default:
            // Hide the markers or remove the overlay from the map view.                
            mapv.getOverlays().clear();
    }       

    // Putting this call here rather than at the beginning, ensures that
    // the Overlay items are drawn over the top of canvas stuff e.g. route lines.
    super.draw(canvas, mapv, false);        
}

オーバーレイを削除するときは、忘れずに mapView.invalidate() を呼び出してください。

于 2011-09-22T10:59:02.367 に答える