Я хочу анимировать маркеры карт, когда они добавляются к карте.
Пользователь должен видеть карту с маркерами вокруг него. Каждый новый маркер должен отскакивать.
Я хочу анимировать маркеры карт, когда они добавляются к карте.
Пользователь должен видеть карту с маркерами вокруг него. Каждый новый маркер должен отскакивать.
Вы можете реализовать 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 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 info window to open, if it
// has one).
return false;
}
Удача