Как перемещать камеру, когда маркер выходит за пределы экрана?

Я работаю над базовым приложением карты для анимационного маркера. Существует один маркер, который обновляется с интервалом в 30 секунд от сервера. Маркер всегда перемещается в центр карты, поэтому я закрываю moveCamera маркер, но когда маркер перемещается за пределы карты, маркер не отображается на карте. Поэтому я хочу, чтобы камера перемещалась, когда маркер переходит с карты

Перед установкой нового положения маркера проверьте его новое положение и текущие границы вида карты.

LatLng newPosition = new LatLng(...); boolean contains = mMap.getProjection() .getVisibleRegion() .latLngBounds .contains(newPosition); if(!contains){ // MOVE CAMERA } // UPDATE MARKER POSITION 
  • Во время каждой новой позиции маркера внутри вида карты маркер перемещается (не центр карты)
  • Просто Если следующая позиция выходит из поля зрения, камера и маркер будут центрированы.

редактировать

Я создал образец маршрута для имитации каждой точки на карте периодически. Маршрут

 public class SampleRoute { public static List<LatLng> GetPoints() { return new ArrayList<>(Arrays.asList( new LatLng(38.4670419, 27.1647131), new LatLng(38.4667244, 27.1648277), new LatLng(38.4666633, 27.1649079), new LatLng(38.4665983, 27.1648022), new LatLng(38.4665958, 27.1647843), new LatLng(38.4665958, 27.1647843), new LatLng(38.4665809, 27.1646429), new LatLng(38.4665704, 27.1645506), new LatLng(38.4665529, 27.1644067), ... } } } 

Затем я создаю метод в активности выборок, который вычисляет границы текущего региона и точки X, Y маркера в этой области. Активность

 private void moveCamera(LatLng destination){ Projection projection = mMap.getProjection(); LatLngBounds bounds = projection.getVisibleRegion().latLngBounds; int boundsTopY = projection.toScreenLocation(bounds.northeast).y; int boundsBottomY = projection.toScreenLocation(bounds.southwest).y; int boundsTopX = projection.toScreenLocation(bounds.northeast).x; int boundsBottomX = projection.toScreenLocation(bounds.southwest).x; int offsetY = (boundsBottomY - boundsTopY) / 10; int offsetX = (boundsTopX - boundsBottomX ) / 10; Point destinationPoint = projection.toScreenLocation(destination); int destinationX = destinationPoint.x; int destinationY = destinationPoint.y; int scrollX = 0; int scrollY = 0; if(destinationY <= (boundsTopY + offsetY)){ scrollY = -(Math.abs((boundsTopY + offsetY) - destinationY)); } else if(destinationY >= (boundsBottomY - offsetY)){ scrollY = (Math.abs(destinationY - (boundsBottomY - offsetY))); } if(destinationX >= (boundsTopX - offsetX)){ scrollX = (Math.abs(destinationX - (boundsTopX - offsetX))); } else if(destinationX <= (boundsBottomX + offsetX)){ scrollX = -(Math.abs((boundsBottomX + offsetX) - destinationX)); } mMap.animateCamera(CameraUpdateFactory.scrollBy(scrollX, scrollY)); mMarker.setPosition(destination); } 

И затем начал имитировать точки

 mHandler.postDelayed(new Runnable() { @Override public void run() { moveCamera(mPoints.get(mCurrentPos)); if(++mCurrentPos < mPoints.size()){ mHandler.postDelayed(this, 1500); } } }, 1500); 

Я пробовал, и он хорошо работает на меня

Итак, если я правильно вас понимаю, и он работает для вас тоже, я могу объяснить.

Когда положение маркера обновляется, вы можете анимировать камеру в положение маркера. Следующий образец кода может помочь вам

  LatLng definedLoc = new LatLng(latitudeValue, longitudeValue); CameraPosition cameraPosition = new CameraPosition.Builder().target(definedLoc).zoom(13.0F).build(); map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

Вы можете анимировать камеру в положение маркера, если границы карты не содержат маркер с помощью GoogleMap.OnCameraChangeListener :

 private Marker marker; // ... @Override public void onCameraChange(final CameraPosition cameraPosition) { ensureMarkerOnBounds(); } private void ensureMarkerOnBounds() { if (marker != null) { if (!mMap.getProjection().getVisibleRegion().latLngBounds.contains(marker.getPosition())) { mMap.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition())); } } } // This is the function that you use to move your marker private void moveMarker (Marker marker) { // ... Your code to move your marker ensureMarkerOnBounds(); } 
Intereting Posts