3 votes

Comment déplacer la caméra lorsque le marqueur sort de l'écran ?

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.

5voto

blackkara Points 2427

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.

1voto

Kanchan Chowdhury Points 523

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

1voto

antonio Points 14882

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X