41

現在、Google Maps Android API v2 を使用してアプリの開発に取り組んでいます。私のコードは次のとおりです。マップに複数のマーカーがあり、ズームアップしてすべてのマーカーを表示するとします。

LatLngBuilder.Builder builder = LatLngBounds.builder();
for(Marker m : markers){
    builder.include(m.getPosition());
}
LatLngBounds bounds = builder.build();
map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10);

このコードは正常に動作していますが、ズーム レベルが 17.0f に達したときにアニメーションを停止したいと考えています。マップ API には、ズーム レベルを制御するメソッドがないようです。この問題を解決するためのアイデアを知っている人はいますか?

4

17 に答える 17

31

Google Maps APIの最近の更新により、必要な機能が導入されました。

GoogleMap.setMaxZoomPreference()

GoogleMap.setMinZoomPreference()

ただし、それでもアニメーションの再生は妨げられません。

于 2016-08-02T05:07:45.970 に答える
25

Google Maps API で直接的な解決策が見つかりませんでした。この問題の潜在的な解決策は、OnCameraChange イベントをリッスンすることです。このイベントがトリガーされ、ズーム レベルが最大ズーム レベルを超えると、animateCamera()を呼び出すことができます。結果のコードは次のようになります。

@Override
public void onCameraChange(CameraPosition position) {
    float maxZoom = 17.0f;
    if (position.zoom > maxZoom)
        map_.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}
于 2013-06-18T17:39:11.857 に答える
18

Android ドキュメントから: https://developers.google.com/maps/documentation/android-api/views

優先する最小および/または最大ズーム レベルを設定すると便利な場合があります。たとえば、アプリが関心のあるポイントの周りに定義された領域を表示する場合、またはズーム レベルのセットが制限されたカスタム タイル オーバーレイを使用している場合、これはユーザー エクスペリエンスを制御するのに役立ちます。

private GoogleMap mMap;
// Set a preference for minimum and maximum zoom.
mMap.setMinZoomPreference(6.0f);
mMap.setMaxZoomPreference(14.0f);
于 2016-10-15T16:41:58.963 に答える
3

カメラをアニメートする前に、境界の SW 点と NE 点が近すぎないかどうかを確認し、必要に応じて境界を調整できます。

        ...
        LatLngBounds bounds = builder.Build();

        var sw = bounds.Southwest;
        var ne = bounds.Northeast;
        var deltaLat = Math.Abs(sw.Latitude - ne.Latitude);
        var deltaLon = Math.Abs(sw.Longitude - ne.Longitude);

        const double zoomN = 0.005; // set whatever zoom coefficient you need!!!
        if (deltaLat < zoomN) {
            sw.Latitude = sw.Latitude - (zoomN - deltaLat / 2);
            ne.Latitude = ne.Latitude + (zoomN - deltaLat / 2);
            bounds = new LatLngBounds(sw, ne);
        }
        else if (deltaLon < zoomN) {
            sw.Longitude = sw.Longitude - (zoomN - deltaLon / 2);
            ne.Longitude = ne.Longitude + (zoomN - deltaLon / 2);
            bounds = new LatLngBounds(sw, ne);
        }

        map.animateCamera(CameraUpdateFactory.NewLatLngBounds(bounds, 10);

ps。私の例は Xamarin の c# ですが、Java 用に簡単に調整できます

于 2013-08-13T10:44:46.387 に答える
2

これが機能するかどうかはわかりませんが、試してみることはできますか

map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);

それが役に立てば幸い

于 2013-06-18T12:37:03.833 に答える
1

@kasimir のアプローチは、緯度または経度の最小度数を設定するため、少し読みにくいと感じました。そこで、緯度の最小値を設定するように微調整しました。これにより、もう少し読みやすくなりました。

private LatLngBounds adjustBoundsForMinimumLatitudeDegrees(LatLngBounds bounds, double minLatitudeDegrees) {
    LatLng sw = bounds.southwest;
    LatLng ne = bounds.northeast;
    double visibleLatitudeDegrees = Math.abs(sw.latitude - ne.latitude);

    if (visibleLatitudeDegrees < minLatitudeDegrees) {
        LatLng center = bounds.getCenter();
        sw = new LatLng(center.latitude - (minLatitudeDegrees / 2), sw.longitude);
        ne = new LatLng(center.latitude + (minLatitudeDegrees / 2), ne.longitude);
        bounds = new LatLngBounds(sw, ne);
    }

    return bounds;
}
于 2014-10-20T23:01:10.060 に答える
0

マップのズームイン機能を直接制限することはできませんが、このように同じ機能を取得することはできます。

map.setOnCameraChangeListener を追加

final float maxZoom = 10.0f;

@Override
public void onCameraChange(CameraPosition position) {

    if (position.zoom > maxZoom)
        map.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}
于 2016-12-27T14:01:03.213 に答える
0

私がやったことは、独自のボタンを作成し、デフォルトのボタンを無効にして、完全に制御できるようにすることでした。

ボタンを配置するには、レイアウトで次のようにします。

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="bottom"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true">

    <Button
        android:id="@+id/bzoomin"
        android:layout_width="55dp"
        android:layout_height="55dp"
        android:gravity="center"
        android:textSize="28sp"
        android:text="+" />
    <Button
            android:id="@+id/bzoomout"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:gravity="center"
            android:textSize="23sp"
            android:text="—" />
</LinearLayout>

次に、デフォルトのボタンを無効にして新しいボタンを設定するコードを以下に示します。

map.getUiSettings().setZoomControlsEnabled(false);

// setup zoom control buttons
Button zoomout = (Button) findViewById(R.id.bzoomout);
zoomout.setOnClickListener(new OnClickListener(){

    @Override
    public void onClick(View v) {
        if(map.getCameraPosition().zoom >= 8.0f){
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomOut());
        }else{
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom out level reached");
        }
    }

});

Button zoomin = (Button) findViewById(R.id.bzoomin);
zoomin.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (map.getCameraPosition().zoom <= 14.0f) {
            // Zoom like normal
            map.animateCamera(CameraUpdateFactory.zoomIn());
        } else {
            // Do whatever you want if user went too far
            Messages.toast_short(MapsActivity.this, "Maximum zoom in level reached");
        }
    }
});
于 2014-11-19T07:06:40.663 に答える
0

最小/最大ズームを簡単にcom.google.android.gms:play-services-maps:9.4.0設定できます。GoogleMap.setMinZoomPreference()とを使用しGoogleMap.setMaxZoomPreference()て、優先する最小および/または最大ズーム レベルを設定できます。詳しくはこちらをご覧ください。

于 2016-08-03T14:24:33.723 に答える
-2

それを呼び出して最大ズームレベルを取得し、getMaxZoomLevel()その値を設定できます。

mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(fromPosition, getMaxZoomLevel()));
于 2013-06-18T12:46:46.787 に答える
-4

マップには maxZoom というプロパティがあります。マップを作成するときに、これを値に設定するだけです

于 2013-03-29T09:50:44.827 に答える