Android zoom v2 zoom لإظهار جميع العلامات


Answers

خريطة جوجل V2: Zoom MarkerOptions داخل الحدود أفضل حل يعمل للأندرويد Marshmallow 6 (API 23، API 24، API 25) كذلك ، يعمل في Xamarin أيضا

LatLngBounds.Builder builder = new LatLngBounds.Builder();

//the include method will calculate the min and max bound.
builder.include(marker1.getPosition());
builder.include(marker2.getPosition());
builder.include(marker3.getPosition());
builder.include(marker4.getPosition());

LatLngBounds bounds = builder.build();

int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
int padding = (int) (width * 0.10); // offset from edges of the map 10% of screen

CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);

mMap.animateCamera(cu);
Question

لدي 10 علامات في GoogleMap . أرغب في التكبير قدر الإمكان والحفاظ على جميع العلامات في العرض؟ في الإصدار السابق يمكن تحقيق ذلك من zoomToSpan() ولكن في v2 ليس لدي أي فكرة عن كيفية القيام بذلك. علاوة على ذلك ، أعرف نصف قطر الدائرة الذي يجب أن يكون مرئيًا.







لدي طريقة أخرى للقيام بهذا الشيء نفسه يعمل بشكل مثالي. وبالتالي فإن الفكرة وراء إظهار جميع العلامات على الشاشة التي نحتاجها إلى منتصف خط العرض والتكبير / التصغير. هنا هي الوظيفة التي سوف تعطيك على حد سواء وتحتاج إلى كل كائنات Latlng علامة كمدخل.

 public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) {
    float max = 0;

    if (l == null || l.length == 0) {
        return null;
    }
    LatLngBounds.Builder b = new LatLngBounds.Builder();
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        b.include(l[count]);
    }

    LatLng center = b.build().getCenter();

    float distance = 0;
    for (int count = 0; count < l.length; count++) {
        if (l[count] == null) {
            continue;
        }
        distance = distance(center, l[count]);
        if (distance > max) {
            max = distance;
        }
    }

    double scale = max / 1000;
    int zoom = ((int) (16 - Math.log(scale) / Math.log(2)));
    return new Pair<LatLng, Integer>(center, zoom);
}

هذه الدالة ترجع كائن الزوج الذي يمكنك استخدامه مثل

زوج = getCenterWithZoomLevel (l1، l2، l3 ..)؛ mGoogleMap.moveCamera (CameraUpdateFactory.newLatLngZoom (pair.first، pair.second))؛

يمكنك بدلاً من استخدام الحشو للحفاظ على علاماتك من حدود الشاشة ، يمكنك ضبط التكبير بمقدار -1.




لم أستطع استخدام onGlobalLayoutlistener ، لذلك هنا هو حل آخر لمنع "Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions." خطأ:

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { 
@Override 
public void onMapLoaded() { 
    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 15));
 } 
});



تعمل بشكل جيد بالنسبة لي.

من هذا الرمز ، أقوم بعرض علامات متعددة مع تكبير معين على شاشة الخريطة.

// المتغيرات المعلنة

private LatLngBounds bounds;
private LatLngBounds.Builder builder;

// طريقة لإضافة نقاط علامة متعددة مع أيقونة drawable

private void drawMarker(LatLng point, String text) {

        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(point).title(text).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon));
        mMap.addMarker(markerOptions);
        builder.include(markerOptions.getPosition());

    }

// لإضافة عدة علامات مرئية على الخريطة

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        builder = new LatLngBounds.Builder();
    for (int i = 0; i < locationList.size(); i++) {

        drawMarker(new LatLng(Double.parseDouble(locationList.get(i).getLatitude()), Double.parseDouble(locationList.get(i).getLongitude())), locationList.get(i).getNo());

     }
     bounds = builder.build();
     CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0);
     mMap.animateCamera(cu);