主要的类

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);}}

更多相关文章

  1. android 开发设置全屏
  2. Android(安卓)实现自定义Toast工具类
  3. android 自定义对话框 背景透明
  4. Android设置全屏两种方式
  5. Android的消息通知--Notification
  6. 下拉列表
  7. Android字体设置
  8. Android(安卓)APN设置之切换网络
  9. android adb 读写模式 挂载文件系统

随机推荐

  1. Mysql解决数据库N+1查询问题
  2. MySQL全文索引实现简单版搜索引擎实例代
  3. MYSQL事务教程之Yii2.0商户提现功能
  4. mysql查询字段类型为json时的两种查询方
  5. MySQL用户与权限的管理详解
  6. MySQL游标概念与用法详解
  7. MySQL存储过程概念、原理与常见用法详解
  8. 简单了解mysql方言dialect
  9. MySQL触发器概念、原理与用法详解
  10. MySQL中NULL对索引的影响深入讲解