android 百度地图长按弹出气泡 popupWindow



                                   百度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();
		}




 demo下载点击打开链接


http://download.csdn.net/detail/zgf1991/4504043



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值