主要的类
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布局文件中添加MapView组件,通过设置API密钥和初始化GoogleMap对象,可以实现在应用中展示地图。同时,可以通过调整Zoom级别来控制地图的缩放程度,使用CameraPosition和CameraUpdateFactory来改变视图...
在Android平台上实现Google Map导航功能,需要利用Google Maps Android API v2。自2013年起,API进行了重大更新,导致旧版本的一些类不再适用。本文将详细介绍如何使用最新的API来实现位置获取、通过地名获取经纬度...
Android google map API例子
在Android开发中,GoogleMap API是一个非常重要的工具,它允许开发者在应用中集成地图功能,实现定位、导航、路线规划等复杂操作。本篇将详细探讨如何在Android应用中使用GoogleMap进行定位。 首先,我们需要在项目...
压缩包中的"MapDemoLayer"和"MyGoogleMap"可能是示例代码的类名,它们可能包含了具体的地图功能实现,比如自定义图层、覆盖物、事件监听等。这些类会扩展GoogleMap的功能,提供更丰富的交互体验。 8. **性能优化**...
本实例,"轨迹记录 android google map 应用",是针对Android开发初学者的一个实战项目,它展示了如何在Android设备上实现轨迹记录功能,结合Google Maps展示行走或移动的路径。这个应用对于户外活动、运动健身或者...
在本示例中,我们将深入探讨如何在Android应用中实现Google Maps的功能,包括获取API密钥、设置权限、集成地图SDK以及添加地图控件。 首先,要在Android应用中展示Google Maps,你需要在Google Cloud Console上创建...
Android Google map使用,Android Google map使用
申请Android Google Map API key
在Android应用开发中,Google Maps API是一个至关重要的组件,它允许开发者将地图功能集成到自己的应用程序中,提供导航、定位、标记等丰富的功能。本文将深入讲解如何进行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 等...
最新版本的Android Google Map 轨迹回放源码, 可以用Google Map实现gps动态导航的功能. 参看博客地址:http://blog.csdn.net/ostrichmyself/article/details/6821112, 修正两个问题: 1. 不能重复播放 2. 拖动才能...
在Android应用开发中,结合Google Map提供路径查询和导航功能是一项常见的需求。本文将详细介绍如何在Android设备上实现这一功能,主要涉及Google Directions API的使用和解析返回的路线数据。 首先,Google ...
本文将详细介绍如何在Android应用中集成Google Map,并实现定位功能。 首先,要在Android应用中使用Google Map,你需要在Google Cloud Platform上创建一个项目并获取API密钥。这个API密钥是你的应用与Google Maps...
总的来说,Android GoogleMap开发涉及多个步骤,包括设置环境、获取API密钥、配置权限以及在代码中实现地图功能。通过这些步骤,开发者可以创建出丰富的地图应用,为用户提供导航、位置查找等多种服务。
实现通过GPS或NetWork获取当前位置的经纬度,并且在Google Map Android v2上显示
在Android开发中,Google Map API是一项重要的功能,它允许开发者集成地图到应用程序中,实现诸如定位、导航、路径规划等多种功能。本实例是关于如何在Android应用中集成和使用Google Map的一个具体实践。 首先,要...
在这里,你可以获取到GoogleMap对象,进一步操作地图,例如设置初始位置、缩放级别,或者添加标记。 关于GPSTest,这是一个常见的Android GPS测试应用的名字,它通常用于测试设备的GPS接收器功能。在Android中,你...
### Android Google Map 入门详解 #### 一、准备工作 要想成功地开发一款基于Google Maps的应用程序,首先需要确保你的开发环境已经准备妥当。这包括申请必要的API密钥、设置正确的开发环境以及确保所有所需的组件...