2017-03-27 18 views
1

Gibt es eine Option Google Map Android Ähnlich iOSGoogleMap.settings.allowScrollGesturesDuringRotateOrZoom?Mapview beim Zoomen deaktivieren Android

im Grunde, was ich erreichen möchte, ist meine relative Layout der Marker im Zentrum der Karte zu halten.

+0

Bitte markieren Sie diese Funktion, um Google mitzuteilen, dass wir es brauchen: https://issuetracker.google.com/issues/69795937 – dan

Antwort

0

Sie können sich darauf beziehen thread. Obwohl wegen ScaleGestureDetector Fehler wird es nur API arbeiten> 16. Die regelmäßige Anwendung Mapview mit Skala Gesten aktiviert auf API < = 16 und API> 16. Reference.

public class CustomEventMapView extends MapView { 

    private int fingers = 0; 
    private GoogleMap googleMap; 
    private long lastZoomTime = 0; 
    private float lastSpan = -1; 
    private Handler handler = new Handler(); 

    private ScaleGestureDetector gestureDetector; 

    public CustomEventMapView(Context context, GoogleMapOptions options) { 
     super(context, options); 
    } 

    public CustomEventMapView(Context context) { 
     super(context); 
    } 

    @Override 
    public void getMapAsync(final OnMapReadyCallback callback) { 
     super.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(final GoogleMap googleMap) { 
       gestureDetector = new ScaleGestureDetector(getContext(), new ScaleGestureDetector.OnScaleGestureListener() { 
        @Override 
        public boolean onScale(ScaleGestureDetector detector) { 
         if (lastSpan == -1) { 
          lastSpan = detector.getCurrentSpan(); 
         } else if (detector.getEventTime() - lastZoomTime >= 50) { 
          lastZoomTime = detector.getEventTime(); 
          googleMap.animateCamera(CameraUpdateFactory.zoomBy(getZoomValue(detector.getCurrentSpan(), lastSpan)), 50, null); 
          lastSpan = detector.getCurrentSpan(); 
         } 
         return false; 
        } 

        @Override 
        public boolean onScaleBegin(ScaleGestureDetector detector) { 
         lastSpan = -1; 
         return true; 
        } 

        @Override 
        public void onScaleEnd(ScaleGestureDetector detector) { 
         lastSpan = -1; 

        } 
       }); 
       CustomEventMapView.this.googleMap = googleMap; 
       callback.onMapReady(googleMap); 
      } 
     }); 
    } 

    private float getZoomValue(float currentSpan, float lastSpan) { 
     double value = (Math.log(currentSpan/lastSpan)/Math.log(1.55d)); 
     return (float) value; 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 

     switch (ev.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_POINTER_DOWN: 
       fingers = fingers + 1; 
       break; 
      case MotionEvent.ACTION_POINTER_UP: 
       fingers = fingers - 1; 
       break; 
      case MotionEvent.ACTION_UP: 
       fingers = 0; 
       break; 
      case MotionEvent.ACTION_DOWN: 
       fingers = 1; 
       break; 
     } 
     if (fingers > 1) { 
      disableScrolling(); 
     } else if (fingers < 1) { 
      enableScrolling(); 
     } 
     if (fingers > 1) { 
      return gestureDetector.onTouchEvent(ev); 
     } else { 
      return super.dispatchTouchEvent(ev); 
     } 
    } 

    private void enableScrolling() { 
     if (googleMap != null && !googleMap.getUiSettings().isScrollGesturesEnabled()) { 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        googleMap.getUiSettings().setAllGesturesEnabled(true); 
       } 
      }, 50); 
     } 
    } 

    private void disableScrolling() { 
     handler.removeCallbacksAndMessages(null); 
     if (googleMap != null && googleMap.getUiSettings().isScrollGesturesEnabled()) { 
      googleMap.getUiSettings().setAllGesturesEnabled(false); 
     } 
    } 
} 

Auch ist hier ein verwandtes Threads, helfen könnten: MapView - Disable dragging around, but allow zooming

+0

Vielen Dank für Ihre Antwort ... Aber die App stürzt ab Die Implementierung von mapview verwenden von Ihnen zur Verfügung gestellt. verursacht durch: java.lang.NoSuchMethodException: [Klasse android.content.Context, Schnittstelle android.util.AttributeSet] –

Verwandte Themen