Je travaille sur une application de base cartographique pour animer les marqueurs. Il y a un marqueur qui est mis à jour par le serveur à un intervalle de 30 secondes. Le marqueur se déplace toujours au centre de la carte, donc je ferme le marqueur moveCamera mais quand le marqueur se déplace en dehors de la carte, il n'apparaît pas dans la vue de la carte. Je veux donc que la caméra se déplace quand le marqueur quitte la vue de la carte.
Réponses
Trop de publicités?Avant de définir la nouvelle position du marqueur, vérifiez sa nouvelle position et les limites actuelles de la vue cartographique.
LatLng newPosition = new LatLng(...);
boolean contains = mMap.getProjection()
.getVisibleRegion()
.latLngBounds
.contains(newPosition);
if(!contains){
// MOVE CAMERA
}
// UPDATE MARKER POSITION
- Lors de chaque nouvelle position du marqueur dans la vue cartographique, le marqueur se déplace (non pas à l'intérieur de la carte). centre de la carte)
- Juste si la position suivante sort du champ de vision, la caméra et le marqueur seront centrés.
Modifier
J'ai créé un itinéraire type pour simuler périodiquement chaque point de la carte. Résumé de l'itinéraire
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),
...
}
}
}
Ensuite, je crée une méthode dans l'activité exemple qui calcule les limites de la région actuelle et les points X, Y du marqueur sur cette région. Résumé de l'activité
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);
}
Et a ensuite commencé à simuler des points
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
moveCamera(mPoints.get(mCurrentPos));
if(++mCurrentPos < mPoints.size()){
mHandler.postDelayed(this, 1500);
}
}
}, 1500);
J'ai essayé et ça marche bien pour moi.
Donc, si je vous comprends bien et que cela fonctionne pour vous aussi, je peux vous expliquer.
Lorsque la position du marqueur est mise à jour, vous pouvez animer la caméra en fonction de la position du marqueur. L'exemple de code suivant peut vous aider
LatLng definedLoc = new LatLng(latitudeValue, longitudeValue);
CameraPosition cameraPosition = new CameraPosition.Builder().target(definedLoc).zoom(13.0F).build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
Vous pouvez animer la caméra jusqu'à la position du marqueur si les limites de la carte ne contiennent pas le marqueur, à l'aide de la fonction 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();
}