2013-12-20 4 views
9

Ich möchte den Marker je nach Lager oder Sensorwert von Accelerometer drehen, um dem Benutzer zu zeigen, wo er sich gerade bewegt. Ich habe Markersymbol und flachen Wert auf True gesetzt, aber es funktioniert nicht wie erforderlich.Drehen Sie den Marker wie in der Benutzerrichtung auf Google Maps V2 Android

mCurrentLocationMarker.position(new LatLng(
          LocationUtils.sLatitude, LocationUtils.sLongitude)); 
        mCurrentLocationMarker.icon(icon); 
        mCurrentLocationMarker.flat(true); 
        mCurrentLocationMarker.rotation(LocationUtils.sBearing); 

        if (currentMarker != null) { 
         currentMarker.setPosition(new LatLng(
           LocationUtils.sLatitude, 
           LocationUtils.sLongitude)); 
        } else { 
         currentMarker = mGoogleMap 
           .addMarker(mCurrentLocationMarker); 
        } 
        animateCameraTo(true); 

habe ich diesen marker als Marker verwendet.

Ich weiß nicht, warum es nicht wie Richtung des Benutzers rotieren. Wenn jemand eine Idee hat, bitte hilf mir, wo ich Fehler mache.

LocationUtils.sBearing ist der Wert von Bearing, den ich von onLocationChanged oder Beschleunigungssensor erhalten habe.

Grundsätzlich möchte ich meinen Marker wie google maps marker machen, der dem Benutzer zeigt, in welche Richtung er sich bewegt oder wendet.

+0

boo !!! irgendeine Antwort für diese oder https://stackoverflow.com/questions/33687236/rotate-marker-as-per-user-direction-on-google-maps-v2-android ????? – Stella

Antwort

7

Dies ist eine alte Frage und es scheint, dass die API seit damals geändert hat.

Ich gehe davon aus, dass Sie die Geräte tragen können. Wenn nicht, ist hier eine handy tutorial.

Als erstes muss ein Marker erstellt werden, den wir für Lager-Updates verwenden können.

private Marker marker; 

// Create this marker only once; probably in your onMapReady() method 
marker = mGoogleMap.addMarker(new MarkerOptions() 
     .position(new LatLng(myLatitude, myLongitude)) 
     .flat(true)); 

Beachten Sie die .flat(true) Teil. Das stellt sicher, dass unser Marker Norden ausgerichtet ist, so dass unsere Lager funktionieren, auch wenn der Benutzer die Karte dreht.

Nun, wenn Sie Ihre Lager-Updates erhalten können Sie die folgenden Aktionen

marker.setRotation(bearing); 
// or if following the linked tutorial 
// marker.setRotation((float) azimuth); 

Dieser Markierer Symbol übernimmt an der Spitze der Vorwärtsrichtung hat. Wenn Ihr Marker wie der abgebildete gedreht wird, müssen Sie das Pendel korrigieren, bevor Sie es auf den Marker setzen. Nur eine einfache setRotation(bearing - 45) sollte es tun.

+0

'if (mLastLocation.hasBearing()) {marker.setRotation (Peilung); } richtig? – Stella

+0

@Stella, wenn Sie sich hier orientieren, sicher – Breavyn

4

Ich schreibe diese Antwort, weil Leute wie ich, die nach einer Lösung in Bezug auf die oben genannte Frage suchen, es nützlich finden könnten.

Also hier, wie ich es gemacht habe.

Wie @colin sagte, müssen Sie .flat(true) aktivieren, um Marker zu drehen.

1.Für Peilwinkel habe ich den folgenden Code verwendet.

Hier latLng1 - meine alten Standort & & latLng2 - meine neue Position

private double bearingBetweenLocations(LatLng latLng1,LatLng latLng2) { 

     double PI = 3.14159; 
     double lat1 = latLng1.latitude * PI/180; 
     double long1 = latLng1.longitude * PI/180; 
     double lat2 = latLng2.latitude * PI/180; 
     double long2 = latLng2.longitude * PI/180; 

     double dLon = (long2 - long1); 

     double y = Math.sin(dLon) * Math.cos(lat2); 
     double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
       * Math.cos(lat2) * Math.cos(dLon); 

     double brng = Math.atan2(y, x); 

     brng = Math.toDegrees(brng); 
     brng = (brng + 360) % 360; 

     return brng; 
    } 

2.To drehen Marker Winkel unter Verwendung der oben Lager ich diesen Code verwendet haben

Hier isMarkerRotating ist ein boolescher Wert. In isMarkerRotating = false in OnCreate Methode

private void rotateMarker(final Marker marker, final float toRotation) { 
     if(!isMarkerRotating) { 
      final Handler handler = new Handler(); 
      final long start = SystemClock.uptimeMillis(); 
      final float startRotation = marker.getRotation(); 
      final long duration = 2000; 

      final Interpolator interpolator = new LinearInterpolator(); 

      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        isMarkerRotating = true; 

        long elapsed = SystemClock.uptimeMillis() - start; 
        float t = interpolator.getInterpolation((float) elapsed/duration); 

        float rot = t * toRotation + (1 - t) * startRotation; 

        float bearing = -rot > 180 ? rot/2 : rot; 

        marker.setRotation(bearing); 

        if (t < 1.0) { 
         // Post again 16ms later. 
         handler.postDelayed(this, 16); 
        } else { 
         isMarkerRotating = false; 
        } 
       } 
      }); 
     } 
    } 

3.Verwendung des obigen Codes

LatLng oldLocation, newLocaation; 

float bearing = (float) bearingBetweenLocations(oldLocation, newLocaation); 
rotateMarker(start_marker, bearing); 
Verwandte Themen