Intereting Posts
Какими размерами должно быть изображение в ящике навигации? Как обрабатывать повторяющиеся строки в Android, чтобы уменьшить использование памяти? ClassNotFoundException при открытии значка общего доступа к facebook в android Намерение получать уведомление о событии соединения BLE на периферии Android Менеджер учетных записей: приложение Android не отображается в разделе «Учетные записи» настроек, Фрагменты исчезают при повороте Андроидный холст не рисует дугу Setter и Getter. В Android. Накладные расходы на производительность? Огромная задержка / отставание UDP с Android Void … значение параметра в описании функции java Почему мы должны использовать sp для размеров шрифтов в Android? Потоковое аудио на http-post в Android Jquery drag drop зависает или застревает в браузере для Android Android 4.1.2 браузер по умолчанию – проблема рендеринга с отключенными полями ввода Создание Recyclerview фиксированной высоты и прокрутки

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

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

На данный момент мой маркер местоположения просто прыгает в другое место при очень изменении местоположения и отмечает маркер там.

Вот что я наделал:

googleMap.setMyLocationEnabled(true); 

Поэтому метод onMyLocationChange вызывается автоматически:

 @Override public void onMyLocationChange(Location location) { curlat = location.getLatitude(); curlong = location.getLongitude(); if (markermylocation != null) { markermylocation.remove(); } curlat = location.getLatitude(); curlong = location.getLongitude(); myLocation(curlat, curlong, username, imageURL, ZOOMVALUE); } 

В методе mylocaiton:

 private void myLocation(double lat, double lng, String name, String url, float zoom) { if(firsttime == 1) { LatLng ll = new LatLng(lat,lng); CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom); googleMap.animateCamera(update); firsttime = 0; } final String uname = name; curlat = lat; curlong = lng; LatLng position = new LatLng(curlat, curlong); markerOptionsmylocaiton = new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromBitmap(icon)).title(uname).anchor(0.5f, 1f); markermylocation = googleMap.addMarker(markerOptionsmylocaiton); LatLng latlang = new LatLng(curlat, curlong); animateMarker(markermylocation, latlang, false); } 

Поэтому каждый раз, когда mylocation называется маркером, он удаляется и вызывает метод mylocation, а затем создает маркер в новом постулате. Вместо этого я хотел бы получить плавный переход маркера, например, карты Google? Как это реализовать?

Обновить:

Поработав пару раз на этом: я пришел к этому коду наконец, но тогда мои маркеры не появляются:

Я использую метод ниже и каждый раз вызываю его в методе myLocation.

 public void animateMarker(final Marker marker, final LatLng toPosition, final boolean hideMarker) { final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); Projection proj = googleMap.getProjection(); Point startPoint = proj.toScreenLocation(marker.getPosition()); final LatLng startLatLng = proj.fromScreenLocation(startPoint); final long duration = 500; final Interpolator interpolator = new LinearInterpolator(); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.getInterpolation((float) elapsed / duration); double lng = t * toPosition.longitude + (1 - t) * startLatLng.longitude; double lat = t * toPosition.latitude + (1 - t) * startLatLng.latitude; marker.setPosition(new LatLng(lat, lng)); if (t < 1.0) { // Post again 16ms later. handler.postDelayed(this, 16); } else { if (hideMarker) { marker.setVisible(false); } else { marker.setVisible(true); } } } }); } 

Благодаря!

Вы должны использовать интерполятор линейный или, возможно, интерполятор ускорения между новым узлом местоположения и текущим узлом маркера. Вот пример с интерполятором отказов.

 final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); final long duration = 2500; final Interpolator interpolator = new BounceInterpolator(); marker.setVisible(true); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = Math.max( 1 - interpolator.getInterpolation((float) elapsed / duration), 0); marker.setAnchor(0.5f, 1.0f + 6 * t); marker.setPosition(latlng) if (t > 0.0) { // Post again 16ms later. handler.postDelayed(this, 16); } } });