Search code examples
javaandroidbitmapandroid-mapviewmylocationoverlay

How can I use a custom bitmap for the "you are here" point in a MyLocationOverlay?


I've poured over the docs and haven't been able to figure this out. Is it even possible?

Please see this


Solution

  • It looks like the correct mechanism to do this is to extend MyLocationOverlay then override the drawMyLocation() protected method.

    The following uses an arrow to show where "you" are and which way "you" are pointing:

    package com.example;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Point;
    import android.location.Location;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapView;
    import com.google.android.maps.MyLocationOverlay;
    
    public class MyCustomLocationOverlay extends MyLocationOverlay {
        private Context mContext;
        private float   mOrientation;
    
        public MyCustomLocationOverlay(Context context, MapView mapView) {
            super(context, mapView);
            mContext = context;
        }
    
        @Override 
        protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {
            // translate the GeoPoint to screen pixels
            Point screenPts = mapView.getProjection().toPixels(myLocation, null);
    
            // create a rotated copy of the marker
            Bitmap arrowBitmap = BitmapFactory.decodeResource( mContext.getResources(), R.drawable.arrow_green);
            Matrix matrix = new Matrix();
            matrix.postRotate(mOrientation);
            Bitmap rotatedBmp = Bitmap.createBitmap(
                arrowBitmap, 
                0, 0, 
                arrowBitmap.getWidth(), 
                arrowBitmap.getHeight(), 
                matrix, 
                true
            );
            // add the rotated marker to the canvas
            canvas.drawBitmap(
                rotatedBmp, 
                screenPts.x - (rotatedBmp.getWidth()  / 2), 
                screenPts.y - (rotatedBmp.getHeight() / 2), 
                null
            );
        }
    
        public void setOrientation(float newOrientation) {
             mOrientation = newOrientation;
        }
    }