2017-01-04 57 views
4

我想創建一個應用程序,如奧拉/超級。我想要移動圖標並在路左轉或右轉時旋轉。我正在使用以下代碼。谷歌地圖旋轉標記/汽車圖標 - Android

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 = 1000; 

      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; 

        marker.setRotation(-rot > 180 ? rot/2 : rot); 
        if (t < 1.0) { 
         // Post again 16ms later. 
         handler.postDelayed(this, 16); 
        } else { 
         isMarkerRotating = false; 
        } 
       } 
      }); 
     } 
    } 

爲了計算軸承:

 currentLocation = location; 
     if(previousLocaton!=null){ 
      previousLocaton = tempLocation; 
      tempLocation = currentLocation; 

      Log.d("previousLocaton=====> ",""+previousLocaton); 
      Log.d("currentLocation=====> ",""+currentLocation); 

      bearing = previousLocaton.bearingTo(currentLocation) ; 
     }else{ 
      previousLocaton = location; 
      tempLocation = location; 
     } 

要設置軸承:

CameraPosition cameraPosition = new CameraPosition.Builder() 
        .target(latLng).zoom(14).bearing(bearing).build(); 

要旋轉標記我請roateMarker方法在onLocationChanged改變的方法:

 currLocationMarker = mMap.addMarker(markerOptions); 
     rotateMarker(currLocationMarker,bearing); 

現在我的圖標正在旋轉。但谷歌地圖也旋轉。我想單獨旋轉圖標。我將以下鏈接指向動畫並移動標記。 Link 1。請讓我有任何想法來解決我的問題。

回答

3

沒有可用於標記

marker.rotation(float value) 

簡單的方法設置標誌的度順時針標記的錨點旋轉。旋轉軸垂直於標記。旋轉0對應於標記的默認位置。當地圖上的標記是平坦的時候,默認位置是北向對齊的,並且旋轉使標記在地圖上始終保持平坦。當標記是廣告牌時,默認位置向上並且旋轉使標記始終面向相機。默認值爲0.

+0

我會嘗試這一點,讓你很快就知道.. – Vijay

+0

您好..對不起,長時間的休息..這也工作得很好。但我面臨另一個問題。我每5秒更換一次標記。當我更換標記時,標記位置從它的真實位置開始。對於我的標記是箭頭標記默認它表示頂級天使。當我從一個地方移動到另一個地方時,我的標記旋轉,並突然從頂部天使開始。請讓我有任何想法來解決這個問題。 – Vijay

+0

這是一個簡單的解決方案,工作正常..! – Vijay

1

使用setRotation(float)方法僅將標記集旋轉旋轉到標記。

static public void rotateMarker(final Marker marker, final float toRotation) { 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final float startRotation = marker.getRotation(); 
     final long duration = 1000; 

     final Interpolator interpolator = new LinearInterpolator(); 
     L.d("Bearing: "+toRotation); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = interpolator.getInterpolation((float) elapsed/duration); 

       float rot = t * toRotation + (1 - t) * startRotation; 
       marker.setRotation(-rot > 180 ? rot/2 : rot); 
       if (t < 1.0) { 
        // Post again 10ms later. 
        handler.postDelayed(this, 10); 
       } 
      } 
     }); 
    } 
+0

我想我使用的是相同的代碼。 – Vijay

+0

是的,只是刪除此代碼CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng).zoom(14).bearing(bearing).build(); –

+0

如果你不想旋轉地圖,但更新位置,然後使用此代碼CameraPosition cameraPosition = new CameraPosition.Builder() .target(latLng).zoom(14).build(); –

1

試試這個:

public void animateMarker(final LatLng toPosition, final LatLng startLatLng, 
          final boolean hideMarker) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = map.getProjection(); 
    Point startPoint = proj.toScreenLocation(d_marker.getPosition()); 
    final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
    // final CameraPosition newcameraPosition = null; 

    final Interpolator interpolator = new LinearInterpolator(); 

    handler.post(new Runnable() { 
     @Override 
     public void run() { 

      Location prevLoc = new Location("service Provider"); 
      prevLoc.setLatitude(startLatLng.latitude); 
      prevLoc.setLongitude(startLatLng.longitude); 

      Location newLoc = new Location("service Provider"); 
      newLoc.setLatitude(toPosition.latitude); 
      newLoc.setLongitude(toPosition.longitude); 

      System.out.println("Locations ---- " + prevLoc + "-" + newLoc); 

      float bearing = prevLoc.bearingTo(newLoc); 

      long elapsed = SystemClock.uptimeMillis() - start; 
      float t = interpolator.getInterpolation((float) elapsed 
        /1000); 
      double lng = t * toPosition.longitude + (1 - t) 
        * startLatLng.longitude; 
      double lat = t * toPosition.latitude + (1 - t) 
        * startLatLng.latitude; 
      d_marker.setPosition(new LatLng(lat, lng)); 
      d_marker.setRotation(bearing); 
      d_marker.setFlat(true); 
      // googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(newcameraPosition)); 


      if (t < 1.0) { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } else { 
       if (hideMarker) { 
        d_marker.setVisible(false); 
       } else { 
        d_marker.setVisible(true); 
       } 
      } 
     } 
    }); 


} 
1

試試下面的方法:

public void animateMarker(final LatLng toPosition, 
          final boolean hideMarker) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = googleMap.getProjection(); 
    Point startPoint = proj.toScreenLocation(cabMarker.getPosition()); 
    final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
// final CameraPosition newcameraPosition = null; 

    final Interpolator interpolator = new LinearInterpolator(); 

    handler.post(new Runnable() { 
     @Override 
     public void run() { 

      Location prevLoc = new Location("service Provider"); 
      prevLoc.setLatitude(startLatLng.latitude); 
      prevLoc.setLongitude(startLatLng.longitude); 

      Location newLoc = new Location("service Provider"); 
      newLoc.setLatitude(toPosition.latitude); 
      newLoc.setLongitude(toPosition.longitude); 

      System.out.println("Locations ---- " + prevLoc + "-" + newLoc); 

      float bearing = prevLoc.bearingTo(newLoc); 

      long elapsed = SystemClock.uptimeMillis() - start; 
      float t = interpolator.getInterpolation((float) elapsed 
        /1000); 
      double lng = t * toPosition.longitude + (1 - t) 
        * startLatLng.longitude; 
      double lat = t * toPosition.latitude + (1 - t) 
        * startLatLng.latitude; 
      cabMarker.setPosition(new LatLng(lat, lng)); 


      cabMarker.setRotation(bearing); 
     // googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(newcameraPosition)); 


      if (t < 1.0) { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } else { 
       if (hideMarker) { 
        cabMarker.setVisible(false); 
       } else { 
        cabMarker.setVisible(true); 
       } 
      } 
     } 
    }); 


}