android google map 实现拉框功能
16lz
2022-06-19
主要的类
package com.activity.control;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PointF;import android.graphics.Paint.Style;import android.graphics.RectF;import android.os.Handler;import android.util.FloatMath;import android.view.GestureDetector;import android.view.GestureDetector.OnDoubleTapListener;import android.view.GestureDetector.OnGestureListener;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import com.activity.MyMapActivity;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;import com.google.android.maps.Projection;/** * <b>类名称:</b>RectangularBoxOverlay<br/> * <b>类描述:</b>矩形框控件<br/> * <b>创建人:</b>ZhengJie<br/> * <b>修改人:</b>ZhengJie<br/> * <b>修改时间:</b>2012-7-11 上午11:41:24<br/> * <b>修改备注:</b><br/> * @version 1.2.0<br/> */public class RectangularBoxOverlay extends Overlay implements OnTouchListener{private static final String TAG = "RectangularBoxOverlay";PointF start = new PointF();PointF mid = new PointF();public float oldDist;public static final int NONE = 0;public static final int DRAG = 1;public static final int ZOOM = 2;public int mode = NONE;private Handler mHandler;public float x=0;public float y=0;public float end_x=0;public float end_y=0;public GeoPoint startPoint;public GeoPoint endPoint;/* 相关变量声明 *///private GestureDetector mGestureDetector = new GestureDetector(this);private Projection myProject;private Context context;private final Paint paint;private Paint box_paint;private Canvas canvas;private MapView mapView;//画笔状态 0绘画中 1绘画完成private int boxState=0;public RectangularBoxOverlay(Context context,Projection project,MapView mapView){this.context=context;this.myProject=project;this.mapView=mapView; // 设置画笔 paint = new Paint(); paint.setColor(Color.RED); // 画笔的粗细 paint.setStrokeWidth(3); paint.setAntiAlias(true); paint.setStrokeMiter(3);// paint.setStyle(Style.STROKE); paint.setAlpha(50); paint.setStyle(Paint.Style.FILL);//设置填满 box_paint = new Paint(); box_paint.setColor(Color.RED); box_paint.setStyle(Style.STROKE); box_paint.setStrokeWidth(3); box_paint.setAntiAlias(true); box_paint.setStrokeMiter(3); }@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);// 得到当前屏幕的高*宽if(shadow) { return; }this.canvas=canvas;int width = canvas.getWidth(); int height = canvas.getHeight();//canvas.drawColor(Color.BLACK); android.graphics.Point pixelPoint = new android.graphics.Point(); if(startPoint!=null){ pixelPoint= myProject.toPixels(startPoint,pixelPoint); x=pixelPoint.x; y=pixelPoint.y; } if(endPoint!=null){ pixelPoint= myProject.toPixels(endPoint,pixelPoint); end_x=pixelPoint.x; end_y=pixelPoint.y; }canvas.save();if(boxState==0){ canvas.drawRect(0, 0, width, height, paint); //System.out.println(x+"+"+ y+"+"+ end_x+"+"+ end_y); canvas.drawRect(x, y, end_x, end_y, box_paint);}else if(boxState==1){paint.setAlpha(0);canvas.drawRect(0, 0, width, height, paint); paint.setAlpha(50);canvas.drawRect(x+3, y+3, end_x-3, end_y-3, paint); canvas.drawRect(x, y, end_x, end_y, box_paint);}canvas.restore();//System.out.println("我在画画");}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event, MapView mapView) {//System.out.println("-------onKeyDown");return super.onKeyDown(keyCode, event, mapView);}@Overridepublic boolean onTouch(View v, MotionEvent event) {//System.out.println("-------进入拖拉模式");//System.out.println(x+"+"+ y+"+"+ end_x+"+"+ end_y);switch (event.getAction() & MotionEvent.ACTION_MASK) {// 设置拖拉模式case MotionEvent.ACTION_DOWN://start.set(event.getX(), event.getY());mode = DRAG;x=event.getX();y=event.getY();//this.canvas=new Canvas();//System.out.println("x:"+x+" y:"+y);startPoint=myProject.fromPixels(new Double(x).intValue() , new Double(y).intValue());break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_UP://System.out.println("弹起了");boxState=1;mode = NONE;((MyMapActivity)this.context).lock_map=false;mapView.invalidate();break;// 设置多点触摸模式case MotionEvent.ACTION_POINTER_DOWN:oldDist = spacing(event);if (oldDist > 10f) {mode = ZOOM;}break;// 若为DRAG模式,则点击移动图片case MotionEvent.ACTION_MOVE:end_x=event.getX();end_y=event.getY();endPoint=myProject.fromPixels(new Double(end_x).intValue() , new Double(end_y).intValue());canvas.drawRect(x, y, end_x, end_y, box_paint);if (mode == DRAG) {mapView.invalidate();//this.draw(new Canvas(), mapView, true);//System.out.println(x+"+"+ y+"+"+ end_x+"+"+ end_y);}// 若为ZOOM模式,则多点触摸缩放else if (mode == ZOOM) {float newDist = spacing(event);if (newDist > 10f) {float scale = newDist / oldDist;//System.out.println(scale+"+"+ scale+"+"+ mid.x+"+"+ mid.y);// 设置缩放比例和图片中点位置}}break;}return false;}// 计算移动距离private float spacing(MotionEvent event) {float x = event.getX(0) - event.getX(1);float y = event.getY(0) - event.getY(1);return FloatMath.sqrt(x * x + y * y);}// 计算中点位置private void midPoint(PointF point, MotionEvent event) {float x = event.getX(0) + event.getX(1);float y = event.getY(0) + event.getY(1);point.set(x / 2, y / 2);}}
更多相关文章
- android 开发设置全屏
- Android(安卓)实现自定义Toast工具类
- android 自定义对话框 背景透明
- Android设置全屏两种方式
- Android的消息通知--Notification
- 下拉列表
- Android字体设置
- Android(安卓)APN设置之切换网络
- android adb 读写模式 挂载文件系统