androidgoogle-maps-markersgoogle-maps-android-api-2

How to create a custom-shaped bitmap marker with Android map API v2


I am developing an Android Application where I'm using Google Map API v2. I need to show the user location on a map with custom markers.

Each marker will show the picture of the user from an URL. The image must be downloaded in asynchronous mode from the server. See the attached screenshot for an example.

How do I add an image and custom information in the marker?

enter image description here


Solution

  • In the Google Maps API v2 Demo there is a MarkerDemoActivity class in which you can see how a custom Image is set to a GoogleMap.

    // Uses a custom icon.
    mSydney = mMap.addMarker(new MarkerOptions()
        .position(SYDNEY)
        .title("Sydney")
        .snippet("Population: 4,627,300")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
    

    As this just replaces the marker with an image you might want to use a Canvas to draw more complex and fancier stuff:

    Bitmap.Config conf = Bitmap.Config.ARGB_8888;
    Bitmap bmp = Bitmap.createBitmap(80, 80, conf);
    Canvas canvas1 = new Canvas(bmp);
    
    // paint defines the text color, stroke width and size
    Paint color = new Paint();
    color.setTextSize(35);
    color.setColor(Color.BLACK);
    
    // modify canvas
    canvas1.drawBitmap(BitmapFactory.decodeResource(getResources(),
        R.drawable.user_picture_image), 0,0, color);
    canvas1.drawText("User Name!", 30, 40, color);
    
    // add marker to Map
    mMap.addMarker(new MarkerOptions()
        .position(USER_POSITION)
        .icon(BitmapDescriptorFactory.fromBitmap(bmp))
        // Specifies the anchor to be at a particular point in the marker image.
        .anchor(0.5f, 1));
    

    This draws the Canvas canvas1 onto the GoogleMap mMap. The code should (mostly) speak for itself, there are many tutorials out there how to draw a Canvas. You can start by looking at the Canvas and Drawables from the Android Developer page.

    Now you also want to download a picture from an URL.

    URL url = new URL(user_image_url);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();   
    conn.setDoInput(true);   
    conn.connect();     
    InputStream is = conn.getInputStream();
    bmImg = BitmapFactory.decodeStream(is); 
    

    You must download the image from an background thread (you could use AsyncTask or Volley or RxJava for that).

    After that you can replace the BitmapFactory.decodeResource(getResources(), R.drawable.user_picture_image) with your downloaded image bmImg.