Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Draw a custom shape in android using XML

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?

like image 563
Zach Avatar asked Jan 20 '16 21:01

Zach


People also ask

What is shape in XML?

The Shape Drawable is an XML file that defines a geometric shape, including colors and gradients. This is used to create a complex shape that can then be attached as the background of a layout or a view on screen.


2 Answers

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

like image 175
gio Avatar answered Nov 15 '22 08:11

gio


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?

like image 33
Gabe Sechan Avatar answered Nov 15 '22 09:11

Gabe Sechan