2017-01-04 6 views
4

Я пытаюсь создать приложение, подобное ola/uber. Я хочу переместить значок и повернуть, когда дорога повернуть налево или вправо. Я использую следующий код.Поверните значок маркера/автомобиля в Google maps - 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); 

Теперь моя иконка вращается. Но карта google также вращается. Я хочу повернуть значок в покое. Я ссылаюсь на следующую ссылку для анимации и перемещения маркера. 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

Try Ниже метод:

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


} 
Смежные вопросы