以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Android 高级开发 』   (http://bbs.xml.org.cn/list.asp?boardid=53)
----  【代码】Android百度地图点击弹出信息框  (http://bbs.xml.org.cn/dispbbs.asp?boardid=53&rootid=&id=126822)


--  作者:挥戈回日
--  发布时间:8/7/2013 4:46:00 PM

--  【代码】Android百度地图点击弹出信息框
我是在百度的demo上改的主要代码:
package com.baidu.mapapi.demo;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.Projection;
public class ItemizedOverlayDemo extends MapActivity {
static MapView mMapView = null;
public View popView;
private double mLat1 = 31.257277; // point1纬度
private double mLon1 = 121.501347; // point1经度
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapviewdemo);
String temp = "测试信息";
BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
if (app.mBMapMan == null) {
app.mBMapMan = new BMapManager(getApplication());
app.mBMapMan.init(app.mStrKey,
new BMapApiDemoApp.MyGeneralListener());
}
app.mBMapMan.start();
// 如果使用地图SDK,请初始化地图Activity
super.initMapActivity(app.mBMapMan);
mMapView = (MapView) findViewById(R.id.bmapView);
mMapView.setBuiltInZoomControls(true);
// 设置在缩放动画过程中也显示overlay,默认为不绘制
mMapView.setDrawOverlayWhenZooming(true);
GeoPoint point = new GeoPoint((int) (mLat1 * 1e6), (int) (mLon1 * 1e6));
mMapView.getController().setCenter(point);
mMapView.getController().setZoom(17);
// 添加ItemizedOverlay
Drawable marker = getResources().getDrawable(R.drawable.iconmarka); // 得到需要标在地图上的资源
marker.setBounds(0, 0, marker.getIntrinsicWidth(),
marker.getIntrinsicHeight()); // 为maker定义位置和边界
mMapView.getOverlays().add(
new OverItemT(marker, this, mLat1, mLon1, temp)); // 添加ItemizedOverlay实例到mMapView
initPopview();
}
@Override
protected void onPause() {
BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
app.mBMapMan.stop();
super.onPause();
}
@Override
protected void onResume() {
BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
app.mBMapMan.start();
super.onResume();
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
private void initPopview() {
popView = super.getLayoutInflater().inflate(R.layout.popview, null);
mMapView.addView(popView, new MapView.LayoutParams(
MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, null,
MapView.LayoutParams.TOP_LEFT));
// 由于气泡的尾巴是在下边居中的,因此要设置成MapView.LayoutParams.BOTTOM_CENTER.
// 这里没有给GeoPoint,在onFocusChangeListener中设置
// views.add(popView);
popView.setVisibility(View.GONE);
}
}
class OverItemT extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> mGeoList = new ArrayList<OverlayItem>();
private Drawable marker;
private ItemizedOverlayDemo mContext;
private TextView textView1;
private TextView textView2;
public OverItemT(Drawable marker, Context context, double mLat1,
double mLon1, String mer_name) {
super(boundCenterBottom(marker));
this.marker = marker;
this.mContext = (ItemizedOverlayDemo) context;
// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
// 构造OverlayItem的三个参数依次为:item的位置,标题文本,文字片段
mGeoList.add(new OverlayItem(p1, "", mer_name));
populate(); // createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// Projection接口用于屏幕像素坐标和经纬度坐标之间的变换
Projection projection = mapView.getProjection();
for (int index = size() - 1; index >= 0; index--) { // 遍历mGeoList
OverlayItem overLayItem = getItem(index); // 得到给定索引的item
String title = overLayItem.getTitle();
// 把经纬度变换到相对于MapView左上角的屏幕像素坐标
Point point = projection.toPixels(overLayItem.getPoint(), null);
// 可在此处添加您的绘制代码
Paint paintText = new Paint();
paintText.setColor(Color.BLUE);
paintText.setTextSize(15);
canvas.drawText(title, point.x - 30, point.y, paintText); // 绘制文本
}
super.draw(canvas, mapView, shadow);
// 调整一个drawable边界,使得(0,0)是这个drawable底部最后一行中心的一个像素
boundCenterBottom(marker);
}
@Override
protected OverlayItem createItem(int i) {
// TODO Auto-generated method stub
return mGeoList.get(i);
}
@Override
public int size() {
// TODO Auto-generated method stub
return mGeoList.size();
}
// 处理当点击事件
protected boolean onTap(int i) {
setFocus(mGeoList.get(i));
MapView.LayoutParams geoLP = (MapView.LayoutParams) mContext.popView
.getLayoutParams();
GeoPoint pt = mGeoList.get(i).getPoint();
mContext.mMapView.updateViewLayout(mContext.popView,
new MapView.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, pt,
MapView.LayoutParams.BOTTOM_CENTER));
mContext.popView.setVisibility(View.VISIBLE);
textView1 = (TextView) mContext.findViewById(R.id.map_bubbleTitle);
textView2 = (TextView) mContext.findViewById(R.id.map_bubbleText);
textView1.setText("提示信息");
textView2.setText(mGeoList.get(i).getSnippet());
ImageView imageView = (ImageView) mContext
.findViewById(R.id.map_bubbleImage);
imageView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mContext.popView.setVisibility(View.GONE);
}
});
return true;
}
@Override
public boolean onTap(GeoPoint arg0, MapView arg1) {
// TODO Auto-generated method stub
return super.onTap(arg0, arg1);
}
}
整个包在附件中,记得自己申请key,好像这个弹出框也可以在谷歌地图上用。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
1,250.000ms