1. draw버튼을 클릭했을 경우 에러가 발생하네요
아마 add메소드를 이용해서 overlay를 중첩되게 받아와서 그런것 같은데
내 위치가 표시된 지도를 한번 받아왔다가 draw버튼이 클릭되었을 경우에 다른 overlay를
받아오고 싶은데 이런식으로 하는 것이 불가능한가요?
 
package com.Messenger;
import java.util.List;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
public class Map_edit extends MapActivity implements OnClickListener {
 private FrameLayout frame;
 private MapView map;
 private MapController controller;
 private MyPositionOverlay positionOverlay;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.map_edit);
  initMapView();
  initZoomControls();
  initMyLocation();
  positionOverlay = new MyPositionOverlay();
  View drawButton = findViewById(R.id.draw_button);
  drawButton.setOnClickListener(this);
  View prev_drawButton = findViewById(R.id.prev_erase);
  prev_drawButton.setOnClickListener(this);
 }
 /** Find and initialize the map view. */
 private void initMapView() {
  frame = (FrameLayout) findViewById(R.id.frame);
  map = (MapView) findViewById(R.id.mapview);
  controller = map.getController();
  map.setSatellite(false);
 }
 /** Get the zoom controls and add them to the bottom of the map. */
 private void initZoomControls() {
  View zoomControls = map.getZoomControls();
  FrameLayout.LayoutParams p = new FrameLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
    Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL);
  frame.addView(zoomControls, p);
 }
 /** Start tracking the position on the map. */
 private void initMyLocation() {
  final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
  overlay.enableMyLocation();
  // overlay.enableCompass(); // no effect in emulator
  overlay.runOnFirstFix(new Runnable() {
   public void run() {
    // Zoom in to current location
    controller.setZoom(16);
    controller.animateTo(overlay.getMyLocation());
   }
  });
  map.getOverlays().add(overlay);
  map.getOverlays().remove(overlay);
 }
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.draw_button:
   List<Overlay> overlays = map.getOverlays();
   overlays.add(positionOverlay);
   break;
   /*
  case R.id.prev_erase:
   List<Overlay> overlays2 = map.getOverlays();
   if (overlays2.isEmpty()) {
   } else
    overlays2.remove(0);
   break;
   */
  }
 }
 @Override
 protected boolean isRouteDisplayed() {
  // Required by MapActivity
  return false;
 }
}

 
draw버튼을 클릭하였을 경우 애러 메세지 입니다.
MyPostionOverlay.draw 라는 것은 overlay를 확장하여 터치로 선을 그려주는 draw클래스를 말하는 것입니다
 
10-28 05:52:45.929: ERROR/AndroidRuntime(9336): Uncaught handler: thread main exiting due to uncaught exception
10-28 05:52:45.969: ERROR/AndroidRuntime(9336): java.lang.NullPointerException
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.Messenger.MyPositionOverlay.draw(MyPositionOverlay.java:59)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.google.android.maps.Overlay.draw(Overlay.java:179)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:45)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.google.android.maps.MapView.onDraw(MapView.java:471)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.View.draw(View.java:5838)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.View.draw(View.java:5841)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.drawChild(ViewGroup.java:1486)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.drawChild(ViewGroup.java:1484)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.View.draw(View.java:5841)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1847)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewRoot.draw(ViewRoot.java:1217)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1030)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1482)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.os.Looper.loop(Looper.java:123)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at android.app.ActivityThread.main(ActivityThread.java:3948)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at java.lang.reflect.Method.invokeNative(Native Method)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at java.lang.reflect.Method.invoke(Method.java:521)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
10-28 05:52:45.969: ERROR/AndroidRuntime(9336):     at dalvik.system.NativeStart.main(Native Method)

 
2. canvas.drawLine으로 두 포인트를 연결하는 선을 그리는데 선 굵기가 너무 얇습니다.
선을 조금 두껍게 할 수 있는 메소드가 있나요?? paint를 빨간색으로 표시된 부분처럼 구현하였는데
선 스타일이 색깔만 바뀌고 여전히 변하지 않네요
 
package com.Messenger;
import com.Messenger.Capture;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.MaskFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.RectF;
import android.location.Location;
import android.view.MotionEvent;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class MyPositionOverlay extends Overlay {
 
 private float trX, trY;
 private float[] mX = new float[100];
 private float[] mY = new float[100];
 int path_idx = 0;
 private float[] prevX = new float[100];
 private float[] prevY = new float[100];
 
 private Paint mPaint;
 private Bitmap mBitmap;
 private Bitmap backImg;
 private Bitmap save;
 private Canvas mCanvas;
 private Path mPath;
 private MaskFilter mEmboss;
 private Capture capture;
  /** Get the position location */
 public Location getLocation() {
  return location;
 }
  /** Set the position location */
 public void setLocation(Location location) {
  this.location = location;
 }
 Location location;
 private final int mRadius = 5;
 @Override
 public void draw(Canvas canvas, MapView mapView, boolean shadow) {
  Projection projection = mapView.getProjection();
  System.out.println("drawwwwwwwwwwwwwwwwwwww");
  if (shadow == false) {
   // Get the current location
   Double latitude = location.getLatitude() * 1E6;
   Double longitude = location.getLongitude() * 1E6;
   GeoPoint geoPoint = new GeoPoint(latitude.intValue(), longitude
     .intValue());
     // Convert the location to screen pixels
     Point point = new Point();
     projection.toPixels(geoPoint, point);
     RectF oval = new RectF(point.x - mRadius, point.y - mRadius,
                            point.x + mRadius, point.y + mRadius);
     // Setup the paint
     Paint paint = new Paint();
     paint.setARGB(255, 255, 255, 255);
     paint.setAntiAlias(true);
     paint.setFakeBoldText(true);
     Paint backPaint = new Paint();
     backPaint.setARGB(180, 50, 50, 50);
     backPaint.setAntiAlias(true);
     RectF backRect = new RectF(point.x + 2 + mRadius, point.y - 3*mRadius,
                                point.x + 65, point.y + mRadius);
    
  mBitmap = Bitmap.createBitmap(640, 480, Bitmap.Config.ALPHA_8);
  mBitmap.eraseColor(0);
  mPath = new Path();
  mPaint = new Paint();
     mPaint.setARGB(255, 255, 0, 0);
     mPaint.setAntiAlias(true);
     mPaint.setMaskFilter(mEmboss);

  mCanvas = new Canvas(mBitmap);
  
     System.out.println("onDraw start--------------");
    
  if (path_idx > 1) {
   System.out.println("path_idx-1=" + (path_idx - 1));
   System.out.println("touch_start prevX=" + prevX); // prev
   System.out.println("touch_start prevY=" + prevY);
   System.out.println("mX[path_idx-1]=" + mX[path_idx - 1]); // current
   System.out.println("mY[path_idx-1]=" + mY[path_idx - 1]);
   int i;
   for (i = 2; i <= path_idx; i++) {
    canvas.drawLine(prevX[i-1], prevY[i-1], mX[i-1], mY[i-1], mPaint);
    
   }
  }
    
   
  System.out.println("onDraw end--------------");
     // Draw the marker
     canvas.drawOval(oval, paint);
     canvas.drawRoundRect(backRect, 5, 5, backPaint);
     canvas.drawText("Here I Am", point.x + 2*mRadius, point.y, paint);
     //canvas.drawPath(mPath, paint);    
   }
   super.draw(canvas, mapView, shadow);
 }
 
 private void touch_start(float x, float y) {
  System.out.println("touch_start");
  mPath.reset();
  
  //mPath.moveTo(x, y);
  
  mX [path_idx] = x;
  mY [path_idx] = y;
  
  if(path_idx > 0)
  {
   prevX[path_idx] = mX [path_idx-1];
   prevY[path_idx] = mY [path_idx-1];
   //System.out.println("touch_start path_idx=" +path_idx);
   //System.out.println("touch_start prevX=" +prevX);
   //System.out.println("touch_start prevY=" +prevY);
   //System.out.println("touch_start mX[path_idx]=" +mX[path_idx]);
   //System.out.println("touch_start mY[path_idx]=" +mY[path_idx]);
  }
  path_idx++;
  System.out.println("touch_end");
 }
 private void touch_up() {
  capture = new Capture();
 
  System.out.println("touch_up");
  mPath.lineTo(mX[path_idx], mY[path_idx]);
  // commit the path to our offscreen
  mCanvas.drawPath(mPath, mPaint);
  // kill this so we don't double draw
  //mCanvas.drawLine(mX[path_idx], mY[path_idx], mX[path_idx++], mY[path_idx++], mPaint);
  mPath.reset();
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event, MapView mapView) {
  System.out.println("start onTouch");
  
  trX = event.getX();
  trY = event.getY();
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   touch_start(trX, trY);
   //invalidate();
   break;
   
  /*case MotionEvent.ACTION_MOVE:
   touch_move(trX, trY);
   break;*/
 
  case MotionEvent.ACTION_UP:
   touch_up();
   //invalidate();
   break;
  }
  return true;
 }
  
 @Override
 public boolean onTap(GeoPoint point, MapView mapView) {
   return false;
 }
}