百度sdk 更改了,现在监听事件里面有了MKMapTouchListener 包括单击长按事件了, 建议去看百度的sdk demo,比较简单
弹气泡现在好像也有PopupOverlay
------ 以下内容不建议看 2014年1月6日17:50:43
这个demo中 一个是长按的overlay, 一个对所有点画连线的overlay.
只是简单的弄出效果,具体需要什么样,就得看各自的需求 改动了
demo下载链接在下面
Main
package com.zeng.map_drawline;
import java.util.ArrayList;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapView;
public class Main extends MapActivity {
private ArrayList<GeoPoint> point;// 模拟点
MapAPP app;
private MapView mapView;
private Drawable marker;
View popView;
void initGeoPoint() {
point = new ArrayList<GeoPoint>();
point.add(new GeoPoint((int) (40.035172 * 1E6), (int) (116.304741 * 1E6)));
point.add(new GeoPoint((int) (39.966579 * 1E6), (int) (116.347313 * 1E6)));
point.add(new GeoPoint((int) (39.939384 * 1E6), (int) (116.349915 * 1E6)));
point.add(new GeoPoint((int) (39.935928 * 1E6), (int) (116.314636 * 1E6)));
point.add(new GeoPoint((int) (39.941044 * 1E6), (int) (116.303902 * 1E6)));
point.add(new GeoPoint((int) (39.983204 * 1E6), (int) (116.309509 * 1E6)));
}
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
app = (MapAPP) this.getApplication();
setContentView(R.layout.main);
if (app.mBMapMan == null) {
app.mBMapMan = new BMapManager(this);
app.mBMapMan.init(app.mStrKey, new MapAPP.MyGeneralListener());
}
app.mBMapMan.start();
super.initMapActivity(app.mBMapMan);
initGeoPoint();
mapView = (MapView) findViewById(R.id.bmapView);
mapView.setBuiltInZoomControls(true);
mapView.setDrawOverlayWhenZooming(true);
marker = getResources().getDrawable(R.drawable.iconmarka);
OverItemT overitem = new OverItemT(this, marker, point);
mapView.getOverlays().add(overitem);
mapView.getController().animateTo(point.get(0));
// 添加长按overlay
LongClickOverlay ov = new LongClickOverlay(this);
mapView.getOverlays().add(ov);
mapView.invalidate();
//
popView = getLayoutInflater().inflate(R.layout.popview, null);
mapView.addView(popView, new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.BOTTOM_CENTER));
popView.setVisibility(View.GONE);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
public void showPopupWindow(int x, int y) {
GeoPoint p = mapView.getProjection().fromPixels(x, y);
MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();
geoLP.point = p;
mapView.updateViewLayout(popView, geoLP);
popView.setVisibility(View.VISIBLE);
mapView.invalidate();
}
}
LongClickOverlay
package com.zeng.map_drawline;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.Projection;
/**
* 继承ItemizedOverlay<OverlayItem> 或是Overlay,看情况了
*
* 这个 只能弄出长按的效果, 若是说 地图上很多确定的点,点击某一个 弹出对应的东西,那就不好判断是哪一个点了。 不知道新的api是否有增加
*
* @author zeng
*
*/
public class LongClickOverlay extends Overlay implements OnDoubleTapListener, OnGestureListener {
private GestureDetector gestureScanner = new GestureDetector(this);
public static final int LONGPRESSINTERVAL = 1000;
private Context mContext;
float x = 0;
float y = 0;
// down - up 毫秒值
protected long time;
// 是否longpress
protected boolean isLongPress = false;
public LongClickOverlay(Context context) {
this.mContext = context;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean arg2) {
// TODO Auto-generated method stub
super.draw(canvas, mapView, arg2);
}
@Override
public boolean onTouchEvent(MotionEvent arg0, MapView mapView) {
x = arg0.getX();
y = arg0.getY();
switch (arg0.getAction()) {
case MotionEvent.ACTION_DOWN:
time = System.currentTimeMillis();
isLongPress = false;
break;
case MotionEvent.ACTION_UP:
if (System.currentTimeMillis() - time > LONGPRESSINTERVAL) {
isLongPress = true;
}
break;
default:
break;
}
return gestureScanner.onTouchEvent(arg0);
}
@Override
public void onLongPress(MotionEvent e) {
x = e.getX();
y = e.getY();
if (mContext instanceof Main) {
((Main) mContext).showPopupWindow((int) x, (int) y);
}
isLongPress = false;
}
@Override
public boolean onTap(GeoPoint arg0, MapView mapView) {
if (!isLongPress)
return super.onTap(arg0, mapView);
return true;
}
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}
连线
package com.zeng.map_drawline;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.Projection;
/**
* 图上各点画连线
* @author zeng
*
*/
public class OverItemT extends ItemizedOverlay<OverlayItem> {
protected List<OverlayItem> mGeoList = new ArrayList<OverlayItem>();
protected Drawable marker;
protected Drawable roughMarker;
protected Context mContext;
protected MapView mapView;
private ArrayList<GeoPoint> geoPoints;
private float[] pts;
public OverItemT(Context context, Drawable marker, ArrayList<GeoPoint> point) {
// TODO Auto-generated constructor stub
super(boundCenter(marker));
this.mContext = context;
this.marker = marker;
this.geoPoints = point;
for (int i = 0; i < point.size(); i++) {
mGeoList.add(new OverlayItem(point.get(i), "", ""));
}
pts = new float[point.size() * 2];
populate();
}
private ArrayList<Point> pt;
public void draw(Canvas canvas, MapView mapView, boolean arg2) {
super.draw(canvas, mapView, arg2);
Projection projection = mapView.getProjection();
pt = new ArrayList<Point>();
for (int index = 0; index < size(); index++) {
OverlayItem overLayItem = getItem(index);
String title = overLayItem.getTitle();
Point point = projection.toPixels(overLayItem.getPoint(), null);
Paint paintText = new Paint();
paintText.setColor(Color.BLUE);
float width = paintText.measureText(title);
canvas.drawText(title, point.x - width / 2, point.y + 30, paintText);
// for( int k = 0; k<size(); k++){
// projection.toPixels(, arg1)
// }
// for(int j = 0; j<size()-1;j++){
// canvas.drawLines(pts, paint)
// canvas.drawLines(pts, offset, count, paint)
// }
// projection.toPixels(geoPoints.get(index), pt.get(index));
pt.add(point);
}
int pts_index = 0;
for (int i = 0; i < pt.size(); i++) {
pts[pts_index] = pt.get(i).x;
pts_index++;
pts[pts_index] = pt.get(i).y;
pts_index++;
}
Paint linePaint = new Paint();
// canvas.drawLines(pts, linePaint);
for( int i = 0; i<pt.size();i++){
if(i+1< pt.size())
drawLine(canvas, pt.get(i), pt.get(i+1), linePaint);
}
}
private void drawLine(Canvas canvas,Point p1,Point p2,Paint p){
canvas.drawLine(p1.x, p1.y, p2.x, p2.y, p);
}
@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();
}
}
// 弹出窗口
popView = getLayoutInflater().inflate(R.layout.popview, null);
mapView.addView(popView, new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.BOTTOM_CENTER));
popView.setVisibility(View.GONE);
public void ShowPopuWindow(int x ,int y){
GeoPoint p =mapView.getProjection().fromPixels(x, y);
MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();
geoLP.point = p;
mapView.updateViewLayout(popView, geoLP);
popView.setVisibility(View.VISIBLE);
mapView.invalidate();
}
http://download.csdn.net/detail/zgf1991/4504043