`
zhengjie_dna
  • 浏览: 10378 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

android google map 实现拉框功能

阅读更多
主要的类

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);
        
        
        
        
	}
	@Override
	public 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("我在画画");
	}
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event, MapView mapView) {
		//System.out.println("-------onKeyDown");
		return super.onKeyDown(keyCode, event, mapView);
	}
	
	
	@Override
	public 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);
	}
	

}

  • 大小: 74.1 KB
  • 大小: 71 KB
分享到:
评论

相关推荐

    安卓 谷歌地图 演示源码android google map

    安卓 android google map 谷歌地图

    android google map 应用

    在Android布局文件中添加MapView组件,通过设置API密钥和初始化GoogleMap对象,可以实现在应用中展示地图。同时,可以通过调整Zoom级别来控制地图的缩放程度,使用CameraPosition和CameraUpdateFactory来改变视图...

    android google map 导航

    在Android平台上实现Google Map导航功能,需要利用Google Maps Android API v2。自2013年起,API进行了重大更新,导致旧版本的一些类不再适用。本文将详细介绍如何使用最新的API来实现位置获取、通过地名获取经纬度...

    Android google map API例子

    Android google map API例子

    android GoogleMap定位(四)

    在Android开发中,GoogleMap API是一个非常重要的工具,它允许开发者在应用中集成地图功能,实现定位、导航、路线规划等复杂操作。本篇将详细探讨如何在Android应用中使用GoogleMap进行定位。 首先,我们需要在项目...

    google-Map.zip_android_android google map_android map_google map

    压缩包中的"MapDemoLayer"和"MyGoogleMap"可能是示例代码的类名,它们可能包含了具体的地图功能实现,比如自定义图层、覆盖物、事件监听等。这些类会扩展GoogleMap的功能,提供更丰富的交互体验。 8. **性能优化**...

    轨迹记录 android google map 应用

    本实例,"轨迹记录 android google map 应用",是针对Android开发初学者的一个实战项目,它展示了如何在Android设备上实现轨迹记录功能,结合Google Maps展示行走或移动的路径。这个应用对于户外活动、运动健身或者...

    android google map example

    在本示例中,我们将深入探讨如何在Android应用中实现Google Maps的功能,包括获取API密钥、设置权限、集成地图SDK以及添加地图控件。 首先,要在Android应用中展示Google Maps,你需要在Google Cloud Console上创建...

    Android Google map使用

    Android Google map使用,Android Google map使用

    申请Android Google Map API key

    申请Android Google Map API key

    Android_Google_Map.rar_Google api_android_android google map_and

    在Android应用开发中,Google Maps API是一个至关重要的组件,它允许开发者将地图功能集成到自己的应用程序中,提供导航、定位、标记等丰富的功能。本文将深入讲解如何进行Android Google Map的开发入门,从搭建环境...

    Android google map开发

    压缩包包含play-services-maps-16.1.0.aar/play-services-places-15.0.1.aar/play-services-location-15.0.1.aar/android-maps-utils-0.5.aar 等...

    [zip文件] Android Google Map 源码_轨迹回放 优化版本

    最新版本的Android Google Map 轨迹回放源码, 可以用Google Map实现gps动态导航的功能. 参看博客地址:http://blog.csdn.net/ostrichmyself/article/details/6821112, 修正两个问题: 1. 不能重复播放 2. 拖动才能...

    Android结合googlemap应用开发

    在Android应用开发中,结合Google Map提供路径查询和导航功能是一项常见的需求。本文将详细介绍如何在Android设备上实现这一功能,主要涉及Google Directions API的使用和解析返回的路线数据。 首先,Google ...

    android Google map 定位程序

    本文将详细介绍如何在Android应用中集成Google Map,并实现定位功能。 首先,要在Android应用中使用Google Map,你需要在Google Cloud Platform上创建一个项目并获取API密钥。这个API密钥是你的应用与Google Maps...

    android GoogleMap开发基础

    总的来说,Android GoogleMap开发涉及多个步骤,包括设置环境、获取API密钥、配置权限以及在代码中实现地图功能。通过这些步骤,开发者可以创建出丰富的地图应用,为用户提供导航、位置查找等多种服务。

    Android中获取当前位置的经纬度,并在Google Map Android v2显示

    实现通过GPS或NetWork获取当前位置的经纬度,并且在Google Map Android v2上显示

    android google map实例

    在Android开发中,Google Map API是一项重要的功能,它允许开发者集成地图到应用程序中,实现诸如定位、导航、路径规划等多种功能。本实例是关于如何在Android应用中集成和使用Google Map的一个具体实践。 首先,要...

    Android googlemap 初学

    在这里,你可以获取到GoogleMap对象,进一步操作地图,例如设置初始位置、缩放级别,或者添加标记。 关于GPSTest,这是一个常见的Android GPS测试应用的名字,它通常用于测试设备的GPS接收器功能。在Android中,你...

    Android google Map入门

    ### Android Google Map 入门详解 #### 一、准备工作 要想成功地开发一款基于Google Maps的应用程序,首先需要确保你的开发环境已经准备妥当。这包括申请必要的API密钥、设置正确的开发环境以及确保所有所需的组件...

Global site tag (gtag.js) - Google Analytics