2015-08-12 22 views
6

Vorrei disattivare lo scorrimento su googlemap Android quando l'utente sta eseguendo lo zoom. In IOS google maps, il suo tipo di facile, basta impostare un parametro: self.settings.allowScrollGesturesDuringRotateOrZoom = NO; Purtroppo, non ho trovato questo tipo di funzionalità in Android e sto cercando soluzioni. L'idea migliore che ho adesso è quella di estendere la vista di googlemaps, intercettare il tocco sulla vista e se l'azione touch è pizzicata, quindi impostare manualmente lo zoom. Ora questo mi sembra abbastanza hacky e inaffidabile. C'è un modo migliore per farlo? Qualche altro suggerimento o idea? Non ho ancora alcun codice su questo, quindi non posso includerne nessuno qui.googlemaps Android V2 - Disabilita scorrimento su pan o zoom

Per qualche contesto, perché questo deve essere fatto, è che c'è un pin al centro che viene utilizzato per contrassegnare il centro esatto della mappa e il centro LatLng viene utilizzato per gli indirizzi di geocodifica.

+0

Si prega di stelle questo richiesta di funzionalità per comunicare a Google che ne abbiamo bisogno: https: // issuetracker.google.com/issues/69795937 – dan

risposta

5

ho finito per fare una soluzione completamente personalizzata, anche se a causa di bug ScaleGestureDetector funzionerà solo API> 16. pubblicheremo aggiornamenti se questo troverò una soluzione a questo. In questo momento io uso MapView regolare con gesti scala endbled su API < = 16 e API> 16 Io uso il mio classe personalizzata:

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

Che cos'è un senso di 'Math.log (1.55d)'? E di tutto il calcolo dello zoom '(Math.log (currentSpan/lastSpan)/Math.log (1.55d))'? – NOSTRA

+0

Quando l'utente continua a toccare la mappa con due dita, il metodo disableScrolling() viene chiamato continuamente. Come bloccarlo dal chiamare? Perché, fa in modo che l'ascoltatore in attesa della telecamera venga chiamato. Ma, ho bisogno di fare alcune operazioni in ascoltatore in attesa della fotocamera. A causa del metodo disableScrolling chiamato continuamente, l'operazione eseguita nel listener inattivo della telecamera si verifica più volte. – Madhan

-2

Tutto quello che dovete fare è assegnare quelli map:uiScrollGestures e map:uiZoomGestures false

map:uiScrollGestures="false" 

map:uiZoomGestures="false" 
+0

Desidero consentire lo scorrimento e lo zoom, ma non consentire lo scorrimento durante lo zoom. Questo disabiliterà completamente i movimenti di scorrimento e zoom. – splangi

Problemi correlati