2015-08-12 21 views
6

Kullanıcı yakınlaştırma yaparken Android googlemaps'ta kaydırma özelliğini devre dışı bırakmak istiyorum. IOS google haritalarında, kolay bir tür, sadece bir parametre ayarla: self.settings.allowScrollGesturesDuringRotateOrZoom = NO; Ne yazık ki, bu tür bir özelliği Android'de bulamadım ve çözümleri arıyorum. Şu anda sahip olduğum en iyi fikir googlemaps görünümünü genişletmek, görünümdeki dokunuşu kesmek ve dokunma eylemi çimdikse zoom'u manuel olarak ayarlamaktır. Şimdi bu bana oldukça hacky ve güvenilmez görünüyor. Bunu yapmanın daha iyi bir yolu var mı? Başka önerileriniz veya fikirleriniz var mı? Bununla ilgili henüz bir kodum yok, bu yüzden burada herhangi birini içeremezsiniz.Android googlemaps V2 - Kaydırma veya kaydırma kaydırma devre dışı bırakma

Bu bağlamda neden yapılması gerektiğine dair bir kestirme için, merkezde, haritanın tam merkezini işaretlemek için kullanılan bir pin ve LatLng merkezi coğrafi kodlama adresleri için kullanılır.

+0

tarihinde buna ihtiyacımız olduğunu bildirmek için bu özellik isteği yıldız edin: Şu anda benim özel sınıfını kullanın> 16 = 16 < ve API API üzerinde endbled ölçek hareketlerle düzenli MapView kullanmak // issuetracker.google.com/issues/69795937 – dan

cevap

5

için bu map:uiScrollGestures ve map:uiZoomGestures çünkü ScaleGestureDetector hata o 16. eğer Güncelleme yayınlamak Will> Yalnızca API çalışacaktır rağmen, tamamen özel bir çözümün yapmak sona erdi ben Buna bir çözüm bulacağım. https:

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); 
     } 
    } 
} 
+3

'Math.log (1.55d)' duygusu nedir? Ve tüm zoom hesaplama '' (Math.log (currentSpan/lastSpan)/Math.log (1.55d)) '? – NOSTRA

+0

Kullanıcı haritayı iki parmağınızla dokunduğunda, disableScrolling() yöntemi sürekli olarak çağrılır. Aramadan nasıl engellenir? Çünkü kamera rölanti dinleyicisini çağırıyor. Ancak, kamera rölanti dinleyicisi bazı işlemleri yapmak gerekir. Sürekli olarak adlandırılan disableScrolling yöntemi nedeniyle, kamera boşta dinleyicide yapılan işlem birçok kez gerçekleşir. – Madhan

-2

yapmanız gereken tek şey atamak olduğu yanlış

map:uiScrollGestures="false" 

map:uiZoomGestures="false" 
+0

Kaydırma ve yakınlaştırmaya izin vermek istiyorum, ancak yakınlaştırma sırasında kaydırmaya izin vermek istemiyorum. Bu, kaydırma ve yakınlaştırma hareketlerini tamamen devre dışı bırakır. – splangi

İlgili konular