最近、マーカー ポップアップ ウィンドウ (情報ウィンドウ) にアニメーションを適用することについて尋ねたところ、それが不可能な理由が説明されました。
注:描画される情報ウィンドウはライブ ビューではありません。
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 を使用してこれと同じことをエミュレートしようとしましたが、できませんでした。これが可能かどうかさえわかりません。たとえば、「MapView」の代わりに「GoogleMap」を使用していますが、これが V1 と V2 の違いの一部と関係があるかどうかはわかりません。
参考までに今あるものを載せておきます。他のプロジェクトからコードを複製して、このプロジェクトで機能するように変更しようとしましたが、コンパイルすることさえできませんでした。
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;
}