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

来源:互联网 发布:麦子金服怎么样 知乎 编辑:程序博客网 时间:2024/05/17 07:11



                                   百度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)));}@Overrideprotected void onCreate(Bundle arg0) {// TODO Auto-generated method stubsuper.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));// 添加长按overlayLongClickOverlay 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);}@Overrideprotected boolean isRouteDisplayed() {// TODO Auto-generated method stubreturn 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;// 是否longpressprotected boolean isLongPress = false;public LongClickOverlay(Context context) {this.mContext = context;}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean arg2) {// TODO Auto-generated method stubsuper.draw(canvas, mapView, arg2);}@Overridepublic 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);}@Overridepublic void onLongPress(MotionEvent e) {x = e.getX();y = e.getY();if (mContext instanceof Main) {((Main) mContext).showPopupWindow((int) x, (int) y);}isLongPress = false;}@Overridepublic boolean onTap(GeoPoint arg0, MapView mapView) {if (!isLongPress)return super.onTap(arg0, mapView);return true;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onDoubleTap(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {// TODO Auto-generated method stubreturn 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 stubsuper(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);}@Overrideprotected OverlayItem createItem(int i) {// TODO Auto-generated method stubreturn mGeoList.get(i);}@Overridepublic int size() {// TODO Auto-generated method stubreturn 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



原创粉丝点击