Недавно я спросил о применении анимации к всплывающему окну маркера (информационному окну), и мне объяснили, почему это невозможно:
Примечание. Отображаемое информационное окно не является просмотром в реальном времени. Представление визуализируется как изображение (с использованием
View.draw(Canvas)
) в момент его возврата. Это означает, что любые последующие изменения вида не будут отражаться в информационном окне на карте. Чтобы обновить информационное окно позже (например, после загрузки изображения), вызовитеshowInfoWindow()
. Кроме того, информационное окно не будет учитывать какую-либо интерактивность, типичную для обычного просмотра, такую как события касания или жестов. Однако вы можете прослушивать общее событие щелчка во всем информационном окне, как описано в разделе ниже.
Изучив еще немного, я нашел проект, использующий V1, который вручную создает представление на позиции маркера. Для этого другой парень сделал что-то вроде этого:
public void showPopup(View view, GeoPoint point, boolean centerPopup) {
removeAllViews();
MapView.LayoutParams lp = new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,
point,
Utils.dipsToPixels(0.0f, mContext),
Utils.dipsToPixels(-12.0f, mContext),
MapView.LayoutParams.BOTTOM_CENTER);
if (centerPopup) {
getController().animateTo(point);
mIgnoreNextChangeEvent = true;
}
View balloon = mInflater.inflate(R.layout.balloon, null);
balloon.setLayoutParams(lp);
((ViewGroup) balloon.findViewById(R.id.balloonBody)).addView(view);
balloon.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.bounce_in));
addView(balloon);
}
Поэтому он вручную создает всплывающее окно и прикрепляет его к MapView.
Я пытался эмулировать то же самое, используя V2, но мне это не удалось, и я даже не знаю, возможно ли это вообще. Например, я использую «GoogleMap» вместо «MapView», и я не уверен, что это как-то связано с некоторыми различиями между версиями 1 и 2.
Я собираюсь добавить то, что у меня есть до сих пор, просто в качестве ссылки. Я попытался воспроизвести код из другого проекта и попытаться изменить его, чтобы он работал в этом, но я даже не смог его скомпилировать.
public boolean onMarkerClick(Marker marker) {
map.removeAllViews();
MapView.LayoutParams lp = new MapView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,
marker.getPosition(),
Tools.dipsToPixels(0.0f, this),
Tools.dipsToPixels(-12.0f, this),
MapView.LayoutParams.BOTTOM_CENTER);
if (centerPopup) {
getController().animateTo(point);
mIgnoreNextChangeEvent = true;
}
View balloon = mInflater.inflate(R.layout.balloon, null);
balloon.setLayoutParams(lp);
((ViewGroup) balloon.findViewById(R.id.balloonBody)).addView(view);
balloon.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.bounce_in));
addView(balloon);
return false;
}