1

概要

現在のマップビューから緯度/経度のスパンに移動できる必要があります。この動きをアニメーション化された方法で実行したいと思います(animateTo動作方法と同様)。現在のビューから移動し、ズームインまたはズームアウトして、ターゲットの緯度/経度のスパンに到達する必要があります。以下は、zoomLevelsを使用するときにこれを行うために使用しているコードです。ただし、これを実現するには、ズームレベルではなく、スパンを使用する必要があります。

[編集]

これが私がしていることですanimateTo。これと同等のものが必要ですが、Lat / Lng Spanを使用して最終ビューに到達します(ズームして中央に配置し、提供されたlat / lngスパンを表示する必要があります)。お気づきのように、私はズームをどの程度使用するかを決定しています...代わりにlat/lngスパンを使用する必要がありますtargetZoomLevelcurrentZoomLevel

public static void smoothZoom(final MapController controller,
        final int currentZoomLevel, final int targetZoomLevel,
        int latitude, int longitude) {

    final Handler handler = new Handler();

    controller.animateTo(new GeoPoint(latitude, longitude), new Runnable() {
        public void run() {

            int currentZoom = currentZoomLevel;
            int zoomTarget = targetZoomLevel;

            // Smooth zoom handler
            // int zoomLevel = _mapView.getZoomLevel();
            // int targetZoomLevel = targetLevel;
            long delay = 0;

            if (zoomTarget > currentZoom) {
                while (currentZoom++ < zoomTarget) {
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            controller.zoomIn();
                        }
                    }, delay);

                    delay += 150; // Change this to whatever is good on the
                                    // device
                }
            } 
        }
    });
}

[編集]

私は今、私のアプリケーションにこのコードが本当に必要です。それを回避する方法はありません。私がコードを機能させるのを手伝ってくれた最初の人は250人の担当者を取得します。

4

4 に答える 4

2

これは私のために働いています:

MapController.setCenter(GeoPoint);

MapControllerは次の場所から入手できます。

MapView.getController();

そして、以下からGeoPointを取得します。

new GeoPoint( (int) ( LAT * 1e6 ) , (int) ( LONG * 1e6 )  );
于 2012-08-27T16:27:07.003 に答える
1

これはあなたが探している種類の解決策ですか?

public static void zoomSpan(final MapView mapView, int northernLat, int southernLat, int easternLon, int westernLon) {
    final int latSpan = northernLat - southernLat;
    final int lonSpan = easternLon - westernLon;
    latCenter = southernLat + latSpan / 2;
    lonCenter = westernLon + lonSpan / 2;

    final MapController controller = mapView.getController();
    final Handler handler = new Handler();

    final Runnable zoomRunnable = new Runnable() {
        public void run() {
            int viewLatSpan = mapView.getLatitudeSpan();
            int viewLonSpan = mapView.getLongitudeSpan();
            boolean actionTaken = false;
            if (mapView.getZoomLevel() > 1 && (latSpan > viewLatSpan || lonSpan > viewLonSpan)) {
                controller.zoomOut();
                actionTaken = true;
            }
            if (mapView.getZoomLevel() < mapView.getMaxZoomLevel() && latSpan * 2 <= viewLatSpan && lonSpan * 2 <= viewLonSpan) {
                controller.zoomIn();
                actionTaken = true;
            }
            if (actionTaken)
                handler.post(zoomRunnable);
        }
    };

    controller.animateTo(latCenter, lonCenter, zoomRunnable);

}
于 2012-10-21T06:02:01.040 に答える
1

私の地図アプリケーションでは、位置検索機能を実装する必要がありました。場所が見つかった場合は、その場所に移動し、オーバーレイを追加して、事前定義されたレベルにズームします。この目的のために次のコードを使用しました。

final int SEARCH_ZOOM_LEVEL = 7;

controller = mMapView.getController();
controller.setZoom(SEARCH_ZOOM_LEVEL );
pointToLocation(s);        // s is the location

pointToLocation()は次のように実装されました:

private void pointToLocation(String s) {
    Geocoder gc = new Geocoder(MapDemo.this, Locale.getDefault());
    try {
        List<Address> addresses = gc.getFromLocationName(
                s, 5);
        String add = "";
        if (addresses.size() > 0) {
            point = new GeoPoint(
                    (int) (addresses.get(0).getLatitude() * 1E6), 
                    (int) (addresses.get(0).getLongitude() * 1E6));
            controller.animateTo(point);
        }    
    } catch (IOException e) {
        Toast.makeText(MapDemo.this, "Location not found", Toast.LENGTH_LONG).show();
    }

}
于 2012-08-28T19:27:23.037 に答える
1

あなたが見ている関数の使用法はzoomToSpan(int latSpanE6、int lonSpanE6)です。

現在のスパン(または簡単に取得できる)とターゲットスパン(ご存知のとおり)があるので、latSpanE6とlongSpanE6をターゲットに向かって段階的に移動しながら、単に遅延でzoomToSpanの呼び出しを開始してみませんか。それほど難しいことではないはずです。すでにほとんどのコードがありますが、ズームレベルをチェックするときにzoomInを使用する代わりに、latSpanE6とlongSpanE6がターゲットスパンに到達したかどうかをチェックするときにzoomToSpanを実行します。

自分でできるので、わざわざコーディングしないでください;)

于 2012-08-30T20:57:01.517 に答える