Draw a custom shape in android using XML
Asked Answered
I

2

6

I am adding a custom marker to the android map view. here is the image I am using for it.It looks like as more markers are placed say about 100 the entire app is getting slow. Here is the image I am using for that.

enter image description here

Instead of using this image, I am planning to draw this image as a shape in XML. How to do that?

Also I am following this tutorial to display a custom marker. Is this custom drawing delaying the app?

Whats the best way to do it?

Innocuous answered 20/1, 2016 at 21:56 Comment(2)
does this need to resize automatically?Roband
no i dont want to resizeInnocuous
D
6

It's possible, but looks like does not make sense. Because Google Map requires only bitmap. So you need create bitmap and draw your shape with help of canvas.

marker.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:width="20dp"
    android:height="20dp"
    android:top="10dp">
    <rotate
        android:fromDegrees="45"
        android:pivotX="75%"
        android:pivotY="40%">
        <shape>
            <solid android:color="#fe696d" />
        </shape>
    </rotate>
</item>

<item
    android:width="@dimen/marker_width"
    android:height="@dimen/marker_height"
    android:bottom="8dp">
    <shape>
        <solid android:color="#4b4b4b" />
        <corners
            android:topLeftRadius="@dimen/marker_corner_radius"
            android:topRightRadius="4dp" />
    </shape>

</item>


<item
    android:width="32dp"
    android:height="26dp"
    android:bottom="4dp"
    android:top="16dp">
    <shape>
        <solid android:color="#fe696d" />
        <corners
            android:bottomLeftRadius="@dimen/marker_corner_radius"
            android:bottomRightRadius="@dimen/marker_corner_radius" />
    </shape>

</item>

dimen.xml

<resources>
    <dimen name="marker_corner_radius">4dp</dimen>
    <dimen name="marker_height">40dp</dimen>
    <dimen name="marker_width">32dp</dimen>
</resources>

part of code to convert shape into bitmap (from fragment/activity with Map)

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.marker, null);
    Canvas canvas = new Canvas();
    int width = getResources().getDimensionPixelOffset(R.dimen.marker_width);
    int height = getResources().getDimensionPixelOffset(R.dimen.marker_height);
    drawable.setBounds(0, 0, width, height);
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    canvas.setBitmap(bitmap);
    drawable.draw(canvas);
    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(bitmap);
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().icon(bitmapDescriptor).position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

result would be next

enter image description here

Decimeter answered 20/1, 2016 at 23:41 Comment(2)
to save time other developers, who will try to figure out thisDecimeter
Preview at Android Studio does not show this shape in correct way, only build & runDecimeter
H
1

The easiest way is just to include a small png or jpg of the marker. It'll be faster to draw and won't take up all that much space. I don't think you can get that shape in xml- the little triangle at the bottom makes it hard, shapes are really limited. You could possibly do it in part xml and part images, but then why bother with the xml?

Histogenesis answered 20/1, 2016 at 22:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.