2015-07-11 3 views
8

Ich habe google map center beim Zoomen mit Doppeltippen und zum Zoomen drücken. Ich habe eine Lösung gefunden für Here, Dies ist nur für Doppel Tippen Sie auf Zoom-Lösung.Wie mache ich Google in der Mitte, wenn du doppelt tippst Klicke und drücke um zu zoomen in android?

TouchableWrapper

public class TouchableWrapper extends FrameLayout { 

    GestureDetectorCompat mGestureDetector; 


    public TouchableWrapper(Context context) { 
     super(context); 
     mGestureDetector = new GestureDetectorCompat(context, mGestureListener); 
    } 


    private final GestureDetector.SimpleOnGestureListener mGestureListener 
      = new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.e("GestureDetector", "Executed"); 
      //Notify the event bus (I am using Otto eventbus of course) that you have just received a double-tap event on the map, inside the event bus event listener 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("double_tapped_map")); 

      return true; 
     } 
    }; 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     mGestureDetector.onTouchEvent(ev); 
     return super.onInterceptTouchEvent(ev); 
    } 


} 

Ich habe Otto für Event-Trigger verwendet.

public class EventBus_Singleton { 

    private static final Bus BUS = new Bus(); 

    public static Bus getInstance() { 
     return BUS; 
    } 

    public EventBus_Singleton() { 
    } 

    public void post(String s) { 
     BUS.post(s); 
    } 
} 

EventBus_Poster

public class EventBus_Poster { 
    public final String string; 

    EventBus_Poster(String string) { 
     this.string = string; 
    } 
} 

In My Map-Aktivität habe ich Ereignis Empfangsverfahren verwendet Karte auf derselben Stelle zu vergrößern.

@Subscribe 
    public void EventBus_singleton(EventBus_Poster event) { 
     Log.e("EventBus_singleton", "Executed"); 
     if (event != null && event.string.equals("double_tapped_map")) { 
      if (mapFragment != null) { 
       mapFragment.getMap().getUiSettings().setZoomGesturesEnabled(false); 
       mapFragment.getMap().getUiSettings().setRotateGesturesEnabled(false); 

       mapFragment.getMap().setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
        @Override 
        public void onCameraChange(CameraPosition cameraPosition) { 
         LatLng lng = cameraPosition.target; 
         Log.e("LatLng", "" + lng); 
        } 
       }); 
       mapFragment.getMap().animateCamera(CameraUpdateFactory.zoomIn(), 400, null); 
      } 

     } 
    } 

Ich habe versucht, ScaleGestureDetector.SimpleOnScaleGestureListener zu verwenden Prise Zoom zu machen, aber es hat nicht funktioniert und es auch irgendwann hinkt. Kann mir jemand helfen, Pinch Zoom in Google Map zu machen?

+0

sind Sie Scrollen zu stoppen suchen? Dann können Sie UiSettings.setScrollGesturesEnabled (false) verwenden. – sachithkn

+0

Ich möchte, dass die Karte in der Mitte bleibt, wenn ich sie zoome, im Normalfall, wenn wir sie zoomen, wird sie weggezogen. – Shvet

+3

Zumindest kommentieren Sie, wenn Sie die Frage ablehnen und einen guten Grund dafür angeben. – Shvet

Antwort

6

Nun, ich habe festgestellt, dass, wenn dies zu tun versuchen, ein erfolgreicher Pinch-to-Zoom sowohl Geschwindigkeit und Skala Zustand beinhaltet. Die Geschwindigkeit wird gemessen, um zu bestimmen, ob Sie wirklich Zoomen möchten, je nachdem, wie schnell Sie die beiden Finger voneinander weg oder näher zueinander bewegt haben. Sie können dies in Google Maps und in Ubers App versuchen, Sie können die Finger tatsächlich von oder weg bewegen näher beieinander, aber so langsam, dass Sie nicht auslösen ein Zoom-in/out-Ereignis auf der Karte!

Also bestimmt die Geschwindigkeit beim Versuch, eine vollständige Pinch Geste zu bestimmen. Zweitens natürlich müssen Sie auch skalieren, und ich habe den Skalenwert ausgedruckt und es ist immer kleiner als genau 1.0, wenn Sie beginnen, zu verkleinern und immer größer als 1,0, wenn Sie zu kneifen beginnen zu zoomen.

Kombination dieser beiden wird auf jeden Fall erhalten Sie bessere Ergebnisse, Geschwindigkeit zuerst sehen würde ich sagen

private final ScaleGestureDetector.OnScaleGestureListener mScaleGestureListener 
     = new ScaleGestureDetector.SimpleOnScaleGestureListener() { 
    /** 
    * This is the active focal point in terms of the viewport. Could be a local 
    * variable but kept here to minimize per-frame allocations. 
    */ 

    float startingSpan; 
    float startFocusX; 
    float startFocusY; 

    @Override 
    public boolean onScaleBegin(ScaleGestureDetector scaleGestureDetector) { 
     startingSpan = scaleGestureDetector.getCurrentSpan(); 
     startFocusX = scaleGestureDetector.getFocusX(); 
     startFocusY = scaleGestureDetector.getFocusY(); 

     return true; 
    } 

    @Override 
    public boolean onScale(ScaleGestureDetector scaleGestureDetector) { 
     float scale = scaleGestureDetector.getCurrentSpan()/startingSpan; 

     mVelocityTracker.computeCurrentVelocity(1000); 

     Log.d("VELOCITY", "X vel : " + mVelocityTracker.getXVelocity()); 
     Log.d("VELOCITY", "Y vel : " + mVelocityTracker.getYVelocity()); 

     if (scale <= 1.0) { 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("pinched_map", "out")); 
     } else { 
      EventBus_Singleton.getInstance().post(new EventBus_Poster("pinched_map", "in")); 
     } 

     return true; 
    } 
}; 
+0

Gelöst für Shvet? oder jemand anderes akzeptiert? lassen Sie uns die Ergebnisse auf Ihrer Seite wissen? – Odaym

+0

Ja, es funktioniert für mich, wie ich brauchte, außer manchmal zieht es auch Karte manchmal wie ich will, dass Benutzer es ziehen. – Shvet

+0

was meinst du mit ziehen? die Aktion, die passiert, wenn Sie zum Beispiel 1 Finger setzen und anfangen, die Karte links nach rechts oben zu ziehen? oder schwenken, wenn Sie die Kamera auf der Karte nach oben und unten bewegen? – Odaym

Verwandte Themen