2013-12-20 5 views
9

加速度計から受け取ったベアリングまたはセンサーの値に応じてマーカーを回転させて、ユーザーが実際にどこに移動しているかを表示します。マーカーアイコンとフラット値をtrueに設定しましたが、必要に応じて機能しません。GoogleマップV2でユーザー方向別にマーカーを回転させます。

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または加速度計から受け取ったBearingの値です。

基本的に私は自分のマーカーを移動方向や向きを変えているユーザーを示すgoogle mapsマーカーと同じにします。

+0

boo !!!これに関するすべての回答または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

'if(mLastLocation.hasBearing()){marker.setRotation(bearing); } 'そうですか? – Stella

+0

@Stellaあなたがベアリングを受ける場所であれば、確かに – Breavyn

4

上記の質問に関連する解決策を探している私のような人が役に立ちそうなので、この回答を投稿してください。

ここで私はそれをやった。

@coolは、.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); 
関連する問題