How can I draw an Arrow showing the driving direction in MapView?
Asked Answered
N

1

11

I use that Google Maps component MapView in an Android application. I can use the GPS location to show my location with a dot. But I would like to show an arrow instead, that points out the driving direction (bearing). I think that I can use the bearing value to get the angle of the arrow.

How can I do that?

Naseby answered 2/12, 2010 at 4:52 Comment(0)
U
19

Assuming you've got the Location then obtain the bearing by doing:

float myBearing = location.getBearing();

To implement the overlay you'll be using ItemizedOverlay and OverlayItem. You'll need to subclass OverlayItem to add the functionality to rotate the Drawable. Something like:

public BitmapDrawable rotateDrawable(float angle)
{
  Bitmap arrowBitmap = BitmapFactory.decodeResource(context.getResources(), 
                                                    R.drawable.map_pin);
  // Create blank bitmap of equal size
  Bitmap canvasBitmap = arrowBitmap.copy(Bitmap.Config.ARGB_8888, true);
  canvasBitmap.eraseColor(0x00000000);

  // Create canvas
  Canvas canvas = new Canvas(canvasBitmap);

  // Create rotation matrix
  Matrix rotateMatrix = new Matrix();
  rotateMatrix.setRotate(angle, canvas.getWidth()/2, canvas.getHeight()/2);

  // Draw bitmap onto canvas using matrix
  canvas.drawBitmap(arrowBitmap, rotateMatrix, null);

  return new BitmapDrawable(canvasBitmap); 
}

Then all that remains to be done is to apply this new Drawable to the OverlayItem. This is done using the setMarker() method.

Underhand answered 2/12, 2010 at 6:23 Comment(5)
Shouldn't I extend Overlay instead, as MyLocationOverlay does?Naseby
This works nicely for me, but I had to change canvas.getWidth(), canvas.getHeight() to canvas.getWidth() / 2, canvas.getHeight() / 2 to rotate around the center of the image (or it gets rotated out of existence)Design
Just FYI - this solution to rotating a bitmap will resolve shrinking issues due to boundaries and rotating. (Search for "android rotate shrink")Consolute
I have also found that this shrinks my image, anyone got a solution?Probity
@Underhand Returning void, should be BitmapDrawable or DrawableBunder

© 2022 - 2024 — McMap. All rights reserved.