title: Android Draw polylines with arrow on google map with direction path
body: <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>