Android Draw polylines with arrow on google map with direction path
<p>I have added polylines but not able to add arrow with direction on google map should be display as below <a href="https://i.stack.imgur.com/QcLwM.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/QcLwM.png" alt="enter image description here"></a></p>

<p>And when it zoom up, more arrow should be display like below <a href="https://i.stack.imgur.com/AWY3C.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/AWY3C.png" alt="enter image description here"></a></p>

<p>I have tried reading various blogs and codes but not able to get the goal </p>

<p>I have used following code snippet below:</p>

<pre><code>private void DrawArrowHead(MarkerOptions MO, GoogleMap mMap, LatLng from, LatLng to) {
        // obtain the bearing between the last two points
        double bearing = GetBearing(from, to);

        // round it to a multiple of 3 and cast out 120s
        double adjBearing = Math.round(bearing / 3) * 3;
        while (adjBearing &gt;= 120) {
            adjBearing -= 120;
        }

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        // Get the corresponding triangle marker from Google
        URL url;
        Bitmap image = null;

        try {
            url = new URL("http://www.google.com/intl/en_ALL/mapfiles/dir_" + String.valueOf((int) adjBearing) + ".png");
            try {
//                image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
                Log.d("HistoryDisplay", String.valueOf(adjBearing));
//                image = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);
                image = BitmapFactory.decodeResource(getResources(), allArrow.get((int) adjBearing));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (image != null) {

            // Anchor is ratio in range [0..1] so value of 0.5 on x and y will center the marker image on the lat/long
            float anchorX = 0.5f;
            float anchorY = 0.5f;

            int offsetX = 0;
            int offsetY = 0;

            // images are 24px x 24px
            // so transformed image will be 48px x 48px

            //315 range -- 22.5 either side of 315
            if (bearing &gt;= 292.5 &amp;&amp; bearing &lt; 335.5) {
                offsetX = 24;
                offsetY = 24;
            }
            //270 range
            else if (bearing &gt;= 247.5 &amp;&amp; bearing &lt; 292.5) {
                offsetX = 24;
                offsetY = 12;
            }
            //225 range
            else if (bearing &gt;= 202.5 &amp;&amp; bearing &lt; 247.5) {
                offsetX = 24;
                offsetY = 0;
            }
            //180 range
            else if (bearing &gt;= 157.5 &amp;&amp; bearing &lt; 202.5) {
                offsetX = 12;
                offsetY = 0;
            }
            //135 range
            else if (bearing &gt;= 112.5 &amp;&amp; bearing &lt; 157.5) {
                offsetX = 0;
                offsetY = 0;
            }
            //90 range
            else if (bearing &gt;= 67.5 &amp;&amp; bearing &lt; 112.5) {
                offsetX = 0;
                offsetY = 12;
            }
            //45 range
            else if (bearing &gt;= 22.5 &amp;&amp; bearing &lt; 67.5) {
                offsetX = 0;
                offsetY = 24;
            }
            //0 range - 335.5 - 22.5
            else {
                offsetX = 12;
                offsetY = 24;
            }

            Bitmap wideBmp;
            Canvas wideBmpCanvas;
            Rect src, dest;

            // Create larger bitmap 4 times the size of arrow head image
            wideBmp = Bitmap.createBitmap(image.getWidth() * 2, image.getHeight() * 2, image.getConfig());

            wideBmpCanvas = new Canvas(wideBmp);

            src = new Rect(0, 0, image.getWidth(), image.getHeight());
            dest = new Rect(src);
            dest.offset(offsetX, offsetY);
            wideBmpCanvas.drawBitmap(image, src, dest, null);
//            MO.position(to);
            MO.icon(BitmapDescriptorFactory.fromBitmap(wideBmp));
            MO.anchor(anchorX, anchorY);

            mMap.addMarker(MO);
//            mMap.addMarker(new MarkerOptions()
//                    .position(to)
//                    .icon(BitmapDescriptorFactory.fromBitmap(wideBmp))
//                    .anchor(anchorX, anchorY));
        }

    }

    private double GetBearing(LatLng from, LatLng to) {
        double lat1 = from.latitude * Math.PI / 180.0;
        double lon1 = from.longitude * Math.PI / 180.0;
        double lat2 = to.latitude * Math.PI / 180.0;
        double lon2 = to.longitude * Math.PI / 180.0;

        // Compute the angle.
        double angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));

        if (angle &lt; 0.0)
            angle += Math.PI * 2.0;

        // And convert result to degrees.
        angle = angle * degreesPerRadian;

        return angle;
    }
</code></pre>