Android用の統合Google MAP API V2を持っています。マーカーのOnclickにカスタム情報ウィンドウを表示したい。それまでは結構です。統合しました。
欲しいもの:マーカーの上部ではなく、マーカーの右側にカスタム情報ウィンドウを表示したい。
以下は私が使用しているコードです:
public class MainActivity extends FragmentActivity {
private MainMapFragement mapFragment;
private HashMap<Marker, EventInfo> eventMarkerMap;
Marker ThirdMarker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = new MainMapFragement();
// FragmentTransaction ft = getFragmentManager().beginTransaction();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.map, mapFragment);
ft.commit();
}
@Override
protected void onStart() {
super.onStart();
setUpEventSpots();
}
private void setUpEventSpots() {
// I'm going to make 2 EventInfo objects and place them on the map
EventInfo firstEventInfo = new EventInfo(new LatLng(50.154, 4.35),
"Right now - event", new Date(), "Party");
EventInfo secondEventInfo = new EventInfo(new LatLng(51.25, 4.15),
"Future Event", new Date(1032, 5, 25), "Convention");
EventInfo thirdEventInfo = new EventInfo(new LatLng(23.25, 72.15),
"Our Next Event", new Date(), "Ahmedabad-India");
// this date constructor is deprecated but it's just to make a simple
// example
Marker firstMarker = mapFragment.placeMarker(firstEventInfo);
Marker secondMarker = mapFragment.placeMarker(secondEventInfo);
ThirdMarker = mapFragment.placeMarker(thirdEventInfo);
eventMarkerMap = new HashMap<Marker, EventInfo>();
eventMarkerMap.put(firstMarker, firstEventInfo);
eventMarkerMap.put(secondMarker, secondEventInfo);
eventMarkerMap.put(ThirdMarker, thirdEventInfo);
// add the onClickInfoWindowListener
mapFragment.getMap().setOnInfoWindowClickListener(
new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
EventInfo eventInfo = eventMarkerMap.get(marker);
Toast.makeText(
getBaseContext(),
"The date of "
+ eventInfo.getName()
+ " is "
+ eventInfo.getSomeDate()
.toLocaleString(),
Toast.LENGTH_LONG).show();
}
});
// Custom Bhavesh
mapFragment.getMap().setInfoWindowAdapter(new InfoWindowAdapter() {
private final View window = getLayoutInflater().inflate(
R.layout.ballonoverlly, null);
@Override
public View getInfoWindow(Marker marker) {
EventInfo eventInfo = eventMarkerMap.get(marker);
String title = marker.getTitle();
TextView txtTitle = ((TextView) window
.findViewById(R.id.textview_name));
if (title != null) {
// Spannable string allows us to edit the formatting of the
// text.
SpannableString titleText = new SpannableString(title);
titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,
titleText.length(), 0);
txtTitle.setText(titleText);
} else {
txtTitle.setText("");
}
// TextView txtType = ((TextView) window
// .findViewById(R.id.textview_aboutme));
// if (eventInfo.getType() != null)
// txtType.setText(eventInfo.getType());
return window;
}
@Override
public View getInfoContents(Marker marker) {
// this method is not called if getInfoWindow(Marker) does not
// return null
return null;
}
});
}
}
xmlファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/RlMain"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >
<LinearLayout
Android:id="@+id/imageview_comment"
Android:layout_width="150dp"
Android:layout_height="62dp"
Android:background="@drawable/map_comment_back"
Android:gravity="center_vertical"
Android:orientation="vertical"
Android:scaleType="fitXY"
Android:visibility="visible" >
<TextView
Android:id="@+id/textview_name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_marginLeft="10dp"
Android:text="Bhavesh Patadiya"
Android:textColor="#FFFFFF"
Android:textStyle="bold" />
<TextView
Android:id="@+id/textview_aboutme"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_marginLeft="10dp"
Android:maxLines="2"
Android:text="How's Going?"
Android:textColor="#FFFFFF"
Android:textStyle="normal" />
</LinearLayout>
</LinearLayout>
以下は私が得ているもののスクリーンショットです:
次に、カスタムInfoWindowを上部ではなくマーカーの右側に配置します。
すべてのヘルプに感謝します。
前もって感謝します。
編集2:
Googleマップの9月の更新(v12または3.2.65)以降、Android API v2 MarkerOptions.infoWindowAnchor が追加されました。かなりの数の新しい関数があるので、 リリースノート も。
編集3:
残念ながら、この追加ではまだ問題を解決できません。そのために 新しい問題 を追加しました。
これは現在不可能です。
ユーザーがマップの移動を許可されていない場合は、View
をMapFragment
に重ねて回避することをお勧めします。可能であれば、「Push techonology」onCameraChange
を使用するか、Handler
およびmap.getCameraPosition()
を使用してポーリングするときに、再配置にいくつかの悪いラグが発生します。
透明なアイコンの付いた追加のマーカーを使用して、可視がクリックされたときに情報ウィンドウを表示しようとすると、同じ問題が発生しますが、実際に実装されているのを確認するほうが楽しいでしょう。
現時点で右側に情報ウィンドウがなくても問題ない場合は、主に この機能はすでにリクエストされています を使用して待機することをお勧めします。
編集:
API v2の3.1.36(rev。7)以降、マーカーのアイコンを変更できます。つまり、2つのアイコンを作成できます。1つは通常のもので、もう1つは右側に情報ウィンドウが開いているように見えます。デフォルトの情報ウィンドウを開くことを無効にし、代わりにこれを使用するとうまくいく場合があります。
以下のコードのように、単純にmarker.getPosition()をscreenPositionに変換することで実行できます
Projection projection = map.getProjection();
LatLng markerLocation = marker.getPosition();
Point screenPosition = projection.toScreenLocation(markerLocation);
int x = screenPosition.x +marker. markerImage.getWidth();
詳細については、以下のリンクを参照してください(getPositionをプロジェクションに変換します)。