1.在res/layout目录下建立pop view的xml文件:overlay_pop.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:background="@drawable/bubble_background"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="5px" android:paddingTop="5px"
android:paddingRight="5px" android:paddingBottom="20px">
<TextView android:id="@+id/map_bubbleTitle" android:ellipsize="marquee"
style="@style/map_BubblePrimary" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_horizontal"
android:singleLine="true" />
<TextView android:id="@+id/map_bubbleText" style="@style/map_BubbleSecondary"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:singleLine="false" />
</LinearLayout>
其中用到的style是放在res/values中的style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="map_BubblePrimary">
<item name="android:textStyle">bold</item>
<item name="android:typeface">monospace</item>
<item name="android:textColor">#000</item>
</style>
<style name="map_BubbleSecondary">
<item name="android:textStyle">italic</item>
<item name="android:textColor">#000</item>
</style>
</resources>
另外,作为背景的bubble_background图片是采用采用9.png的格式:
在onCreate中:
MapView是继承自ViewGroup 的,因此,MapView有addView()方法,同时还有MapView.LayoutParams
MapView.LayoutParams 可以根据GeoPoint来定位,我就是利用这个特性来定位弹出的popView的.
View popView = View.inflate(this, R.layout.overlay_pop, null);
mapView.addView(popView, new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.BOTTOM_CENTER));
popView.setVisibility(View.GONE);
2.实现点击某个Overlay弹出popView。
overlay有onTap()方法,你可以实现自己的overlay onTap()方法,弹出popView,
也可以使用setOnFocusChangeListener(),在listener中实现弹出popView,.
我是用的listener,因为setOnFocusChangeListener在失去焦点也会触发,我可以再失去焦点的时候隐藏popView.
/**
* 气泡窗口监听器
*/
private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {
@Override
public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {
// 创建气泡窗口
if (popView != null) {
popView.setVisibility(View.GONE);
}
if (newFocus != null) {
MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();
geoLP.point = newFocus.getPoint();// 这行用于popView的定位
TextView title = (TextView) popView.findViewById(R.id.map_bubbleTitle);
title.setText(newFocus.getTitle());
TextView desc = (TextView) popView.findViewById(R.id.map_bubbleText);
if (newFocus.getSnippet() == null || newFocus.getSnippet().length() == 0) {
desc.setVisibility(View.GONE);
} else {
desc.setVisibility(View.VISIBLE);
desc.setText(newFocus.getSnippet());
}
mapView.updateViewLayout(popView, geoLP);
popView.setVisibility(View.VISIBLE);
}
}
};
3.自己实现一个继承自ItemizedOverlay的Overlay,
Overlay中有一个
private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG;
private final ArrayList<OverlayItem> overlayItems = new ArrayList<OverlayItem>();
和用于向overlayItems中添加OverlayItem的方法
public void addOverlay(OverlayItem overlay) {
overlayItems.add(overlay);
populate();
}
在override的draw方法中
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
if (!shadow) {
canvas.save(LAYER_FLAGS);
Projection projection = mapView.getProjection();
int size = overlayItems.size();
Point point = new Point();
Paint paint = new Paint();
paint.setAntiAlias(true);
OverlayItem overLayItem;
for (int i = 0; i < size; i++) {
overLayItem = overlayItems.get(i);
Drawable marker = overLayItem.getMarker(0);
// marker.getBounds()
/* 象素点取得转换 */
projection.toPixels(overLayItem.getPoint(), point);
if (marker != null) {
boundCenterBottom(marker);
}
/* 圆圈 */
paint.setColor(Color.RED);
canvas.drawCircle(point.x, point.y, 5, paint);
/* 标题 */
String title = overLayItem.getTitle();
if (title != null && title.length() > 0) {
paint.setColor(Color.BLACK);
paint.setTextSize(15);
canvas.drawText(title, point.x, point.y, paint);
}
}
canvas.restore();
}
super.draw(canvas, mapView, shadow);
}
在onCreate中初始化
overlay.addOverlay(new OverlayItem(pointQSH, "清水河", "清水河校区"));
overlay.addOverlay(new OverlayItem(pointSH, "沙河", "沙河校区"));
overlay.setOnFocusChangeListener(onFocusChangeListener);
mapView.getOverlays().add(overlay);
OK,实现效果: