Как я могу переместить маркер в текущее местоположение

У меня уже есть опыт работы с двумя фиксированными географическими точками

Вот что я использовал:

private void autoAnimateMarker() {

    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

    mMap.getUiSettings().setZoomControlsEnabled(true);

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

    mMap.setMyLocationEnabled(true);

    LatLng fromLocation = new LatLng(-33.904438, 151.249852); 
    LatLng toLocation = new LatLng(-33.905823, 151.252422);
    Marker marker = mMap.addMarker(new MarkerOptions().position(fromLocation));
    MarkerAnimation.animateMarkerToICS(marker, toLocation, new LatLngInterpolator.Spherical());

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(fromLocation, 17F));
}

Затем вызывая его в onMapReady(...)

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    autoAnimateMarker();

}

ПОКАЗАТЬ ТЕКУЩЕЕ РАСПОЛОЖЕНИЕ

Я уже прошел - https://stackoverflow.com/a/34582595/3585072

В настоящее время метод onLocationChanged (Location location) выглядит следующим образом, что мне нужно поместить здесь, чтобы динамически перемещать мой маркер на основе изменения Location:

@Override
public void onLocationChanged(Location location)
{
    Toast.makeText(this, "Location Changed " + location.getLatitude()
            + location.getLongitude(), Toast.LENGTH_LONG).show();

    mLastLocation = location;
    if (mCurrLocationMarker != null) {
        mCurrLocationMarker.remove();
    }

    //Place current location marker
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latLng);
    markerOptions.title("Current Position");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
    mCurrLocationMarker = mGoogleMap.addMarker(markerOptions);

    //move map camera
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11));
}
1
Sophie 3 Сен 2017 в 18:25

4 ответа

Лучший ответ

Это final solution, который я предоставил для Get, Update и Animate Marker для current location

LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

if(ourGlobalMarker == null) { // First time adding marker to map
    ourGlobalMarker = mGoogleMap.addMarker(new MarkerOptions().position(latLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
    MarkerAnimation.animateMarkerToICS(ourGlobalMarker, latLng, new LatLngInterpolator.Spherical());
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18));
} else {
    MarkerAnimation.animateMarkerToICS(ourGlobalMarker, latLng, new LatLngInterpolator.Spherical());
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18));
}

< EM> Feel free to use this code and let me know if you need any update on this.

3
SO Profile 9 Сен 2017 в 07:52

Нет необходимости удалять маркер при изменении вашего местоположения и добавлять его снова на карту. Вы можете установить положение маркера следующим образом.

Во-первых, смотрите: https://gist.github.com/broady/6314689

Если местоположение обновляется , интервал больше ~ 3 секунд :

public void onLocationChanged(Location location) {
    LatLng toLocation = new LatLng(location.getLatitude(), location.getLongitude());
    if (fromLocation != null) {
        mAnchorMarker.setPosition(fromLocation);
        MarkerAnimation.animateMarkerToICS(mAnchorMarker, toLocation, new LatLngInterpolator.Spherical());
    }
    fromLocation = toLocation;
}

Если местоположение обновляется интервал слишком короткий (не анимируйте, просто переместите маркер):

public void onLocationChanged(Location location) {
    LatLng toLocation = new LatLng(location.getLatitude(), location.getLongitude());
    mAnchorMarker.setPosition(toLocation);
}

Вы должны инициализировать маркер в onMapReady вместо onLocationChanged.

0
Dorukhan Arslan 7 Сен 2017 в 10:54

MarkerAnimation класс не был доступен в моей API версии. Ниже описано, как я это сделал в своем приложении.

Marker mCurrLocationMarker = null;
LatLng latLng;

@Override
public void onLocationChanged(Location location){

    latLng = new LatLng(location.getLatitude(), location.getLongitude());
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latLng);
    markerOptions.title("My Location");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));

    if(mCurrLocationMarker == null) { // Add marker and move camera on first time
        mCurrLocationMarker = mGoogleMap.addMarker(markerOptions);
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13));
    } else { // Update existing marker position and move camera if required
        mCurrLocationMarker.setPosition(latLng);
//        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13));
        }
}
0
UsamaAmjad 5 Июн 2018 в 04:03

Сделать одну вещь поставить фоновый поток, который повторяется каждые 2 секунды. Удалить предыдущий маркер и установить маркер внутри этой темы. Я думаю, это один из возможных способов. если вы перемещаете долготу, широта также изменяется, поэтому маркер перемещается каждые 2 секунды.

0
arjun babu 6 Сен 2017 в 11:28