2013-12-20 94 views
9

我想根據從加速度傳感器接收到的方位或傳感器值旋轉標記,以向用戶顯示實際移動的位置。我已將標記圖標和平面值設置爲true,但不能按要求運行。根據用戶指示在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); 

我已經使用這個marker作爲標記。

我不知道爲什麼它不按照用戶的方向旋轉。如果有人有任何想法,請在我犯錯的地方幫助我。

LocationUtils.sBearing是我從onLocationChanged或加速度計收到的方位的值。

基本上我想讓我的標記與谷歌地圖標記相同,它顯示用戶在哪個方向移動或轉動。

+0

噓聲!!!任何回答這個或https://stackoverflow.com/questions/33687236/rotate-marker-as-per-user-direction-on-google-maps-v2-android ????? – Stella

回答

7

這是一個老問題,看起來API自那時以來已經發生了變化。

我假設你能夠獲得設備承載。如果這裏不是handy tutorial

首先要創建一個我們可以用於軸承更新的標記。

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)); 

注意.flat(true)部分。確保我們的標記向北對齊,以便即使用戶旋轉地圖,我們的軸承也能正常工作。

現在,當您得到您的軸承更新,你可以做以下

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

這裏假設你的標記圖標在頂部的前進方向。如果您的標記像圖中那樣旋轉,則在將其設置到標記之前,您必須調整軸承進行補償。只是一個簡單的setRotation(bearing - 45)應該這樣做。

+0

'如果(mLastLocation.hasBearing()){marker.setRotation(軸承); 「對吧? – Stella

+0

@Stella如果那是你從哪裏得到你的方位,當然 – Breavyn

4

Im發佈了此答案,因爲像我這樣的人正在尋找與上述問題相關的解決方案可能會發現它很有用。

所以在這裏,我是如何做到的。

由於@colin表示您必須啓用.flat(true)來旋轉標記。

1.對於方位角我使用了下面的代碼。

這裏latLng1 - 我的舊位置& & latLng2 - 我的新位置

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使用上述方位角我已經使用這個代碼

這裏isMarkerRotating是一個布爾值旋轉標記。在OnCreate方法

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添加isMarkerRotating = false。使用上述代碼

LatLng oldLocation, newLocaation; 

float bearing = (float) bearingBetweenLocations(oldLocation, newLocaation); 
rotateMarker(start_marker, bearing); 
相關問題