Intereting Posts

Как анимировать маркер, когда он добавляется для отображения на Android?

Я хочу анимировать маркеры карт, когда они добавляются к карте.

Пользователь должен видеть карту с маркерами вокруг него. Каждый новый маркер должен отскакивать.

Solutions Collecting From Web of "Как анимировать маркер, когда он добавляется для отображения на Android?"

Вы можете реализовать onMarkerClick() и onMarkerClick() маркер всякий раз, когда пользователь нажимает на него. Просто попробуйте выполнить код ниже. Я пробовал, и все работает отлично.

  private Marker mPerth; private Marker mPerth = mMap.addMarker(new MarkerOptions() .position(PERTH) .title("Perth") .snippet("Population: 1,738,800")); 
  @Override public boolean onMarkerClick(final Marker marker) { // This causes the marker at Perth to bounce into position when it is clicked. if (marker.equals(mPerth)) { final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); Projection proj = mMap.getProjection(); Point startPoint = proj.toScreenLocation(PERTH); startPoint.offset(0, -100); final LatLng startLatLng = proj.fromScreenLocation(startPoint); final long duration = 1500; final Interpolator interpolator = new BounceInterpolator(); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.getInterpolation((float) elapsed / duration); double lng = t * PERTH.longitude + (1 - t) * startLatLng.longitude; double lat = t * PERTH.latitude + (1 - t) * startLatLng.latitude; marker.setPosition(new LatLng(lat, lng)); if (t < 1.0) { // Post again 16ms later. handler.postDelayed(this, 16); } } }); } // We return false to indicate that we have not consumed the event and that we wish // for the default behavior to occur (which is for the camera to move such that the // marker is centered and for the marker's info window to open, if it has one). return false; } 

Вы также можете использовать это во время добавления маркера в приложение помимо события onClick . Надеюсь, это то, что вы хотите.

Вы можете добавить любой новый макет в MapView в качестве маркера карты:

 public void AddAnimMarkerToMap(MapView map, GeoPoint geoPoint, int id, int animResId) { var layoutParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent, geoPoint, MapView.LayoutParams.Center); var ll = new LinearLayout(map.Context) { Id = id, Orientation = Orientation.Vertical }; ll.SetGravity(GravityFlags.Center); var iv = new ImageView(map.Context); iv.SetImageResource(animResId); ll.AddView(iv); map.AddView(ll, layoutParams); var markerAnimation = (AnimationDrawable)iv.Drawable; markerAnimation.Start(); ll.LayoutParameters = layoutParams; } 

Возможно, вы можете добавить ImageView напрямую без размытия макета. AnimResId – ресурс, выделяемый для анимации кадра (аналогично маркеру Android Mylocation).

http://developer.android.com/guide/topics/resources/animation-resource.html#Frame

Прикрепите маркер к экрану или в стартовой позиции, затем запустите анимацию.

Обратите внимание, что .setAnchor, используемый в этом методе, был добавлен в google map api v2 в мае 2013 года

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

Привяжите маркер к экрану .setAnchor (.5f, (размер экрана выше маркера / размер маркера)) // для демоверсии карты около 6f для моего тестового телефона. Измените анимацию на отскок до того же значения, что и 6f для моего тестового телефона.

 private void addMarkersToMap() { // A few more markers for good measure. mPerth = mMap.addMarker(new MarkerOptions().position(PERTH) .title("Perth").snippet("Population: 1,738,800") .anchor(.5f, 6f) ); 

Измените анимацию так, чтобы она подпрыгивала (размер экрана выше маркера / размер маркера) (6f на моем тестовом телефоне) . Я просто использую обработчик onclick, потому что он уже настроен, чтобы подпрыгивать с изменением настроек до 6f и более длительной продолжительностью. Итак, после того, как все маркеры были добавлены на карту, я запускаю обработчик кликов.

 this.onMarkerClick(mPerth); 

Измененный обработчик onMarkerClick с длительностью 6f и более длительный.

 @Override public boolean onMarkerClick(final Marker marker) { if (marker.equals(mPerth)) { // This causes the marker at Perth to bounce into position when it // is clicked. final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); final long duration = 2500; final Interpolator interpolator = new BounceInterpolator(); 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); if (t > 0.0) { // Post again 16ms later. handler.postDelayed(this, 16); } } }); } else if (marker.equals(mAdelaide)) { // This causes the marker at Adelaide to change color. marker.setIcon(BitmapDescriptorFactory.defaultMarker(new Random() .nextFloat() * 360)); } // We return false to indicate that we have not consumed the event and // that we wish // for the default behavior to occur (which is for the camera to move // such that the // marker is centered and for the marker's info window to open, if it // has one). return false; } 

Удачи