我的计划是允许用户在地图上绘制一个矩形以标记某个区域,然后保存它。我找到了一种方法来做到这一点,但它没有做任何事情。这是代码到目前为止的样子。
public class Map extends MapActivity{
private MapView mvMap;
MapController kontrol;
float xs, ys, xe, ye;
GeoPoint start, end;
private Paint paint = new Paint();
private boolean up = false;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.map);
mvMap = (MapView) findViewById(R.id.mvMap);
mvMap.setBuiltInZoomControls(true);
paint.setStrokeWidth(2.0f);
//
// DrawOverlay t = new DrawOverlay();
// List<Overlay> olList = mvMap.getOverlays();
// olList.add(t);
mvMap.getOverlays().add(new EmptyOverlay());
mvMap.postInvalidate();
kontrol = mvMap.getController();
GeoPoint ja = new GeoPoint(52172722, 21071987);
kontrol.animateTo(ja);
kontrol.setZoom(11);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
class DrawOverlay extends Overlay{
public boolean onTouchEvent(MotionEvent e, MapView m){
if(up = false){
if(e.getAction() == MotionEvent.ACTION_DOWN){
xs = ys = 0;
xs = e.getX();
ys = e.getY();
start = mvMap.getProjection().fromPixels((int)xs,(int)ys);
//draw(null, m, up);
}
if(e.getAction() == MotionEvent.ACTION_MOVE){
xe = e.getX();
ye = e.getY();
end = mvMap.getProjection().fromPixels((int)xe,(int)ye);
}
if(e.getAction() == MotionEvent.ACTION_UP){
up = true;
}
}
return true;
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when) {
if(start != null && end != null){
//get the 2 geopoints defining the area and transform them to pixels
//this way if we move or zoom the map rectangle will follow accordingly
Point screenPts1 = new Point();
mapView.getProjection().toPixels(start, screenPts1);
Point screenPts2 = new Point();
mapView.getProjection().toPixels(end, screenPts2);
//draw inner rectangle
paint.setColor(0x4435EF56);
paint.setStyle(Style.FILL);
canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
//draw outline rectangle
paint.setColor(0x88158923);
paint.setStyle(Style.STROKE);
canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
}
return true;
}
}
public class EmptyOverlay extends Overlay {
private float x1,y1;
private Overlay overlay = null;
public EmptyOverlay(){
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
long when) {
// TODO Auto-generated method stub
return super.draw(canvas, mapView, shadow, when);
}
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView) {
// if(mv.isEditMode()){
if(e.getAction() == MotionEvent.ACTION_DOWN){
//when user presses the map add a new overlay to the map
//move events will be catched by newly created overlay
x1 = y1 = 0;
x1 = e.getX();
y1 = e.getY();
overlay = new DrawOverlay();
mapView.getOverlays().add(overlay);
}
if(e.getAction() == MotionEvent.ACTION_MOVE){
}
//---when user lifts his finger---
if (e.getAction() == MotionEvent.ACTION_UP) {
}
// return true;
// }
return false;
}
}
我将不胜感激任何帮助。
答案 0 :(得分:3)
使用此代码,它将适用于您在任何标记位置上绘制带有内部文本的rectangel。此代码将为许多朋友绘制许多矩形,我们已通过覆盖项目
public void draw(android.graphics.Canvas canvas, MapView mapView,
boolean shadow)
{
super.draw(canvas, mapView, shadow);
// go through all OverlayItems and draw title for each of them
for (OverlayItem item:mOverlays)
{
GeoPoint point = item.getPoint();
Point markerBottomCenterCoords = new Point();
mapView.getProjection().toPixels(point, markerBottomCenterCoords);
/* Find the width and height of the title*/
TextPaint paintText = new TextPaint();
Paint paintRect = new Paint();
Rect rect = new Rect(markerBottomCenterCoords.x,markerBottomCenterCoords.y,33,44);
paintText.setTextSize(FONT_SIZE);
paintText.getTextBounds(item.getTitle(), 0, item.getTitle().length(), rect);
// rect.height()=34;
rect.inset(-TITLE_MARGIN, -TITLE_MARGIN);
int markerHeight=34;// this will place to a height of 34 athe top of the mark location
rect.offsetTo(markerBottomCenterCoords.x - rect.width()/2, markerBottomCenterCoords.y - markerHeight - rect.height());
paintText.setTextAlign(Paint.Align.CENTER);
paintText.setTextSize(FONT_SIZE);
paintText.setARGB(255, 255, 255, 255);
paintRect.setARGB(255,148,0,211);//s(255, 178, 34, 34);
paintRect.setTextAlign(Align.CENTER);
canvas.drawRoundRect( new RectF(rect), 0, 29, paintRect);
canvas.drawText(item.getTitle(), rect.left + rect.width() / 2,
rect.bottom - TITLE_MARGIN, paintText);
}
}